|
|
发表于 2005-11-21 20:28:00
|
显示全部楼层
Re:对VB的效率不满意?原因可能出在你自己身上哦!
(名字修正,“第二次的也成第一次了”)
贴出最终代码 我也只能达到这步了,哪位高手继续优化,就算为了给C/C++的程序员争气)
C代码:
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[])
{
register unsigned long i=100000000,d=0,d1=10;
DWORD st=GetTickCount();
/*其实这样优化才是程序员的本质
if (i%10==0) while(i>0){i-=10;d+=10;}
else if(i%4==0) while(i>0){i-=4;d+=4;}
else if(i%2==0) while(i>0){i-=2;d+=2;}
else while(i>0){i-=1;d+=1;}*/
while(i>0){i-=1;d+=1;} /*为了比速度只好麻烦点*/
printf("d的结果(第一次):%d\n",d);
while(i<5){++i;d1=(d1<<3)+(d1<<1);}
printf("d的结果(第二次):%d\n一共执行时间:%d毫秒\n",d1,GetTickCount()-st);
system(" AUSE");
return 0;
}
----------------------------------------
初级代码优化:
1.上面加重的部分有利于程序的执行,就是所谓的"贪心"的政策,本来一个循环只能加一,但利用上面的代码可以一次加10,甚至1000,这种优化一定很快(大多数情况下)
2.寄存器优化,"register +变量申请格式",利用在寄存器里的速度优势,大多数的情况比内存的访问是快的,因为我用VB用的不是很深,如果有,尽量也用这个优化,特别是计算速度要求特别高的情况下.
3.while(i<5){++i;d1=(d1<<3)+(d1<<1);}
我没有用 *10 而用了两个移位指令,我觉得二进制的运算总是快的,<<3 相当于 *2^3=*8 再加上 <<1=*2^1=*2 正好是*10,这个我没有仔细验证,优化多少我也不清楚,有兴趣大家可以测试一下.
4.大家可以看我最早的代码,在第一次的时候,一个变量第一次我请0,汇编就是"mov eax,0" (假如不优化,变量是寄存器变量"register"),这样一直加到目的数,这样后面会多出N条语句,合理利用语句的位置和加减关系也是基本程序员需要的素质。
5.++i 和 i++ 的问题,如果不是y=(i++)+1这种样的话,你完全可以把i++变成++i,据说能提高不少速度,VB相关的我不知道,其实是一个自增的运算符,VB 的 x=x-1,会变成汇编代码 "sub x,1" 而同样的自减的汇编代码是"dec x",既节省文件的大小,而且加快了速度,不知VB家族有没有,有尽量不要用"x=x+1"等等这种的语句了。
------------------------------------------
感谢 liiir1985 提供 与本优化相关的VB代码,现在用VB的不妨看看他的代码,肯定会有所帮助的 |
|