一些简单编程技巧的总结(一)
2007-09-11 10:48
369 查看
技巧:程序应以类似RISC(精简指令系统计算机)的形式来编写。换句话说,尽量简化你的代码,而不是使它更复杂。处理器特别喜欢简单指令,而不是复杂的指令,你的程序可以长些,但应尽量使用简单指令,使程序相对于编辑器来说更加简单些。例如,不要编写类似下面的程序:
if((x+=(2*buffer[index++])>10)
{
//进行工作
}//结束
应这样做
x+=(2*buffer[index]);
index++
if(x>10)
{
//进行工作
}//结束if
技巧:尽量使用32位变量而不用8位变量或16位变量,Pentium和之后的处理器全部都是32位的,这就意味着它们并不喜欢8位或16位的数据字符,实际上,更小的数据可能会由于超高速缓存和其他相关的内存寻址异常而使速度下降,例如,读者可能创建一个如下所示的结构:
struct CPOINT
{
short x,y;
unsigned char c;
}//结束CPINT
尽管这个结构看上去很好,但实际并非如此!首先,结构本身目前是一个5字符长的结构——2个short+1个char=5。这实际上是一个很差的设计,这将导致内存地址崩溃。更好的结构形式如下:
struct CPOINT
{
int x,y;
int c;
}//结束CPINT
技巧:使用内联功能。通过使用内联指令来完全摆脱调用功能甚至能够改善上面的技巧。内联指令不调用函数,而指示编译器将被调用函数代码放在需要调用该函数的最佳位置,这样做会使程序变得更大,但却提高了运行速度。下面是一个实例。
inline void Plot_I (int x,int y,int color)
{
//在屏幕上画一个点像素
video_buffer[x + y * MEMORY_PITCH] = color;
}//结束Plot_I
技巧:不要怕使用全局变量,许多视频游戏不使用大量的带有形参的、与时间相关的函数,而是使用一个全局变量来代替,例如一个函数的代码如下:
void Plot(int x,int y,int color)
{
//在屏幕上画一个点像素
video_buffer[x + y * MEMORY_PITCH] = color;
}//结束Plot
函数体运行的时间小于函数调用所需的时间。这是由于参数压入和弹出堆栈造成的。在这种情况下,更好的方法可能是创建一个全局变量,然后在调用前进行赋值,像下面一样:
int gx,gy,gz,gcolor;//定义一些全局变量
void Plot_G(void)
{
//使用全局变量来画一个点像素
video_buffer(gx + gy * MEMORY_PITCH] = gcolor;
}//结束Plot_G
技巧:使用内联功能。通过使用内联指令来完全摆脱调用功能甚至能够改善上面的技巧。内联指令不调用函数,而指示编译器将被调用函数代码放在需要调用该函数的最佳位置,这样做会使程序变得更大,但却提高了运行速度。下面是一个实例。
inline void Plot_I (int x,int y,int color)
{
//在屏幕上画一个点像素
video_buffer[x + y * MEMORY_PITCH] = color;
}//结束Plot_I
注意:这里并没有使用全局变量,因为编辑器有效运行了相同类型数据的别名,但是全局变量迟早会派上用场,如果在函数调用时,一个或两个形参已改变,由于没有重新加载,所以旧的参数值有可能仍被使用。
技巧:按照这种方式来编写代码有两个原因,首先,它允许调试程序在代码各部分之间放置断点;第二,这将更易于编译器向Pentium处理器传送简单指令,这样将使处理器使用更多的执行单元并行地处理代码。复杂的代码就比较糟糕。
对于简单的、是2的倍数的整数乘法运算,应使用二进制移位运算。因为所有的数据在计算机中都以二进制存储,位组合向左或右移动就等同于乘法和除法运算。例如:
int y_pos = 10
//将y_pos乘以64
y_pos = (y_pos << 6);//2^6=64
相似的有
{
//将y_pos除以8
y_pos = (y_pos >> 3);//1/2^3=1/8
if((x+=(2*buffer[index++])>10)
{
//进行工作
}//结束
应这样做
x+=(2*buffer[index]);
index++
if(x>10)
{
//进行工作
}//结束if
技巧:尽量使用32位变量而不用8位变量或16位变量,Pentium和之后的处理器全部都是32位的,这就意味着它们并不喜欢8位或16位的数据字符,实际上,更小的数据可能会由于超高速缓存和其他相关的内存寻址异常而使速度下降,例如,读者可能创建一个如下所示的结构:
struct CPOINT
{
short x,y;
unsigned char c;
}//结束CPINT
尽管这个结构看上去很好,但实际并非如此!首先,结构本身目前是一个5字符长的结构——2个short+1个char=5。这实际上是一个很差的设计,这将导致内存地址崩溃。更好的结构形式如下:
struct CPOINT
{
int x,y;
int c;
}//结束CPINT
技巧:使用内联功能。通过使用内联指令来完全摆脱调用功能甚至能够改善上面的技巧。内联指令不调用函数,而指示编译器将被调用函数代码放在需要调用该函数的最佳位置,这样做会使程序变得更大,但却提高了运行速度。下面是一个实例。
inline void Plot_I (int x,int y,int color)
{
//在屏幕上画一个点像素
video_buffer[x + y * MEMORY_PITCH] = color;
}//结束Plot_I
技巧:不要怕使用全局变量,许多视频游戏不使用大量的带有形参的、与时间相关的函数,而是使用一个全局变量来代替,例如一个函数的代码如下:
void Plot(int x,int y,int color)
{
//在屏幕上画一个点像素
video_buffer[x + y * MEMORY_PITCH] = color;
}//结束Plot
函数体运行的时间小于函数调用所需的时间。这是由于参数压入和弹出堆栈造成的。在这种情况下,更好的方法可能是创建一个全局变量,然后在调用前进行赋值,像下面一样:
int gx,gy,gz,gcolor;//定义一些全局变量
void Plot_G(void)
{
//使用全局变量来画一个点像素
video_buffer(gx + gy * MEMORY_PITCH] = gcolor;
}//结束Plot_G
技巧:使用内联功能。通过使用内联指令来完全摆脱调用功能甚至能够改善上面的技巧。内联指令不调用函数,而指示编译器将被调用函数代码放在需要调用该函数的最佳位置,这样做会使程序变得更大,但却提高了运行速度。下面是一个实例。
inline void Plot_I (int x,int y,int color)
{
//在屏幕上画一个点像素
video_buffer[x + y * MEMORY_PITCH] = color;
}//结束Plot_I
注意:这里并没有使用全局变量,因为编辑器有效运行了相同类型数据的别名,但是全局变量迟早会派上用场,如果在函数调用时,一个或两个形参已改变,由于没有重新加载,所以旧的参数值有可能仍被使用。
技巧:按照这种方式来编写代码有两个原因,首先,它允许调试程序在代码各部分之间放置断点;第二,这将更易于编译器向Pentium处理器传送简单指令,这样将使处理器使用更多的执行单元并行地处理代码。复杂的代码就比较糟糕。
对于简单的、是2的倍数的整数乘法运算,应使用二进制移位运算。因为所有的数据在计算机中都以二进制存储,位组合向左或右移动就等同于乘法和除法运算。例如:
int y_pos = 10
//将y_pos乘以64
y_pos = (y_pos << 6);//2^6=64
相似的有
{
//将y_pos除以8
y_pos = (y_pos >> 3);//1/2^3=1/8
相关文章推荐
- 总结两个Javascript的哈稀对象的一些编程技巧
- 总结两个Javascript的哈稀对象的一些编程技巧
- 总结两个Javascript的哈稀对象的一些编程技巧
- 总结两个Javascript的哈稀对象的一些编程技巧
- ACM数论一些简单结论和编程小技巧总结
- 总结两个Javascript的哈稀对象的一些编程技巧
- 个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
- 总结两个Javascript的哈稀对象的一些编程技巧
- 网络编程的一些简单总结
- 总结两个Javascript的哈稀对象的一些编程技巧
- 个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
- iPhone编程的一些技巧总结
- Android学习笔记:练习中用到的一些技巧总结
- Shell编程技巧总结
- QT界面(控件)相关设计的一些技巧总结
- Java简单的一些总结
- PHP代码优化的一些技巧总结
- VB.NET编程技巧与实例集粹 Module5_输入简单表达式并求值
- 深度学习框架Lasagne的一些总结和技巧
- Flex]Flex编程注意之性能优化、垃圾回收的一些总结