这段代码能够优化加速吗?

软件和网站开发以及相关技术探讨
回复
sickeeno2
帖子: 22
注册时间: 2007-11-12 22:10

这段代码能够优化加速吗?

#1

帖子 sickeeno2 » 2008-01-26 23:29

代码: 全选

#include <stdio.h>
#include <time.h>
#include <math.h>

#define IMAGE_WIDTH	1000
#define IMAGE_HEIGHT  1000

guchar *pos;
guchar rgbbuf[IMAGE_WIDTH * IMAGE_HEIGHT * 3];
int main()
{
	gint x,y;
	pos = rgbbuf;
	gdouble vx,vy;
	
	guchar bright= 0;
	GTimeVal  timestart;
	g_get_current_time(&timestart);
	for (y = 0; y< IMAGE_HEIGHT;y++)
	{
		vx=0;
		vy=0;
		gdouble tmpy = ((256-bright)/(gdouble)IMAGE_HEIGHT)*((gdouble)y);
		for (x= 0; x<IMAGE_WIDTH; x++)
		{
			vx +=(256-bright)/(gdouble)IMAGE_WIDTH;
			vy += (tmpy)/IMAGE_WIDTH;
			guchar r,g,b;
			r	= floor(vx);
			g = floor(vy);
			b = floor(vy);
			
			*pos++ =r;       		/*Red. */
			*pos++ =g;			/*Green. */
			*pos++ =b;           /*Blue. */
		}
	}
	GTimeVal  timeend;
	g_get_current_time(&timeend);
	
	glong lostTime = timeend.tv_usec - timestart.tv_usec;
	g_print("The Calendar Time lost %d\n", lostTime); 
	return (0);
}


此代码目的是生成一个颜色面板的Buff,但测试发现速度不理想,不知道能不能对其进行优化……此代码的思路是一样些javascript的方式在思考,不知道在C上面有没有其他的办法....
附件
此代码目的是生成一个颜色面板的Buff
此代码目的是生成一个颜色面板的Buff
color.jpg (4.55 KiB) 查看 1283 次
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#2

帖子 BigSnake.NET » 2008-01-27 13:31

预先算好, 用的时候立刻画出来
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
sickeeno2
帖子: 22
注册时间: 2007-11-12 22:10

#3

帖子 sickeeno2 » 2008-01-27 16:57

BigSnake.NET 写了:预先算好, 用的时候立刻画出来
其实最后肯定是先计算Buff,然后用gdk_draw_rgb_image(),但现在要解决的问题是这个颜色面板的颜色是动态更新的,比如动态更改bright变量。。。。

Gimp里面的颜色面板计算相当的快,我没有找到此代码,有接近的,但没有完全看懂其计算方式

我现在在考虑用SSE指令是否可以提速。。。。。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#4

帖子 eexpress » 2008-01-27 17:02

取色?不如转换思维,直接显示svg。然后取色。
● 鸣学
halve
帖子: 45
注册时间: 2005-09-09 11:32

#5

帖子 halve » 2008-01-31 11:26

一般优化都是找出时间瓶颈,即最消耗时间的地方,想办法提高效率
这个程序,需要在循环里头优化,尽量减少循环中的运算

代码: 全选

   for (y = 0; y< IMAGE_HEIGHT;y++)
   {
      vx=0;
      vy=0;
      gdouble tmpy = ((256-bright)/(gdouble)IMAGE_HEIGHT)*((gdouble)y);
      //(256-bright)/(gdouble)IMAGE_HEIGHT 可以提前算好
     //节省(IMAGE_HEIGHT - 1)次整数减法和浮点除法运算
      for (x= 0; x<IMAGE_WIDTH; x++)
      {
         vx +=(256-bright)/(gdouble)IMAGE_WIDTH;
         //(256-bright)/(gdouble)IMAGE_WIDTH可以提前算好
        //节省(IMAGE_WIDTH * IMAGE_HEIGHT -1)次整数减法和浮点除法运算
         vy += (tmpy)/IMAGE_WIDTH;
         guchar r,g,b;
         r   = floor(vx);
         g = floor(vy);
         b = floor(vy);
         //估计这 3 个 floor() 调用是消耗时间的大头
         //g 跟 b 都是 floor(vy) ,不知道有没有什么差别
         //如果没有,直接 b = g; 节省(IMAGE_WIDTH * IMAGE_HEIGHT)次 floor() 调用开销
        //另外需要对 floor() 本身优化,比如写成 宏,避免函数调用的开销,优化 floor() 的算法之类。。。
         
         *pos++ =r;             /*Red. */
         *pos++ =g;         /*Green. */
         *pos++ =b;           /*Blue. */
      }
   } 
[/code]
sickeeno2
帖子: 22
注册时间: 2007-11-12 22:10

#6

帖子 sickeeno2 » 2008-02-21 2:33

非常感谢,我去试一试
sickeeno2
帖子: 22
注册时间: 2007-11-12 22:10

#7

帖子 sickeeno2 » 2008-02-21 3:57

问题主要出在floor()调用上

谢谢5楼的解答
回复