首页 > 未分类 > (转)一段代码优化的讨论
2019
11-29

(转)一段代码优化的讨论

 优化很多时候是必要的,特别对于瓶颈程序。这里讨论一段代码的优化过程,从而演示一段简单的代码优化过程,并希望得到一些建议。

先描述一下需求:

一个16位数的序列,将其奇数位置放到一个序列,偶数问题放到另外一个序列。注意奇数和偶数序列的长度不一定相同。

最简单的代码:

 

 1(转)一段代码优化的讨论 - 第1张  | 逗分享开发经验void CTestClass::SplitToEvenOddSeqs(short *sp,short *dp1,short *dp2,int evenLen,int oddLen)
 2(转)一段代码优化的讨论 - 第2张  | 逗分享开发经验
 3(转)一段代码优化的讨论 - 第3张  | 逗分享开发经验{
 4(转)一段代码优化的讨论 - 第6张  | 逗分享开发经验
 5(转)一段代码优化的讨论 - 第7张  | 逗分享开发经验            int i;
 6(转)一段代码优化的讨论 - 第8张  | 逗分享开发经验
 7(转)一段代码优化的讨论 - 第9张  | 逗分享开发经验            for(i = 0;i<oddLen;i++,sp+=2,dp1++,dp2++)
 8(转)一段代码优化的讨论 - 第10张  | 逗分享开发经验
 9(转)一段代码优化的讨论 - 第11张  | 逗分享开发经验            {
10(转)一段代码优化的讨论 - 第14张  | 逗分享开发经验
11(转)一段代码优化的讨论 - 第15张  | 逗分享开发经验                        dp1[0= sp[0];
12(转)一段代码优化的讨论 - 第16张  | 逗分享开发经验
13(转)一段代码优化的讨论 - 第17张  | 逗分享开发经验                        dp2[0= sp[1];
14(转)一段代码优化的讨论 - 第18张  | 逗分享开发经验
15(转)一段代码优化的讨论 - 第19张  | 逗分享开发经验            }

16(转)一段代码优化的讨论 - 第20张  | 逗分享开发经验
17(转)一段代码优化的讨论 - 第21张  | 逗分享开发经验            if(i != evenLen)
18(转)一段代码优化的讨论 - 第22张  | 逗分享开发经验
19(转)一段代码优化的讨论 - 第23张  | 逗分享开发经验                        dp1[0= sp[0];
20(转)一段代码优化的讨论 - 第24张  | 逗分享开发经验
21(转)一段代码优化的讨论 - 第25张  | 逗分享开发经验}

22(转)一段代码优化的讨论 - 第26张  | 逗分享开发经验
23(转)一段代码优化的讨论 - 第27张  | 逗分享开发经验

这段代码可以达到必要的功能,但他肯定不是优化的。

1.循环中,每次需要访问5个变量。

2.每次循环需要一个判断,4个加法

3.最后的不等式判断也

考虑到dp1dp2总是同时访问,于是定义一个结构体:

 

(转)一段代码优化的讨论 - 第28张  | 逗分享开发经验typedef struct tagDstData
(转)一段代码优化的讨论 - 第29张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第30张  | 逗分享开发经验
{
(转)一段代码优化的讨论 - 第33张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第34张  | 逗分享开发经验            
short dp1;
(转)一段代码优化的讨论 - 第35张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第36张  | 逗分享开发经验            
short dp2;
(转)一段代码优化的讨论 - 第37张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第38张  | 逗分享开发经验}
TagDstData;
(转)一段代码优化的讨论 - 第39张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第40张  | 逗分享开发经验

现在的算法为:

 

(转)一段代码优化的讨论 - 第41张  | 逗分享开发经验void CTestClass::SplitToEvenOddSeqs(short *sp,TagDstData *dp,int evenLen,int oddLen)
(转)一段代码优化的讨论 - 第42张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第43张  | 逗分享开发经验
{
(转)一段代码优化的讨论 - 第46张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第47张  | 逗分享开发经验            
int i;
(转)一段代码优化的讨论 - 第48张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第49张  | 逗分享开发经验            
for(i = 0;i<oddLen;i++,sp+=2,dp++){
(转)一段代码优化的讨论 - 第52张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第53张  | 逗分享开发经验                        dp
->dp1 = sp[0];
(转)一段代码优化的讨论 - 第54张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第55张  | 逗分享开发经验                        dp
->dp2 = sp[1];
(转)一段代码优化的讨论 - 第56张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第57张  | 逗分享开发经验            }

(转)一段代码优化的讨论 - 第58张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第59张  | 逗分享开发经验            
if(i < evenLen)
(转)一段代码优化的讨论 - 第60张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第61张  | 逗分享开发经验                        dp
->dp1 = sp[0];
(转)一段代码优化的讨论 - 第62张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第63张  | 逗分享开发经验}

(转)一段代码优化的讨论 - 第64张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第65张  | 逗分享开发经验

这样做以后CPU每次读取dp只需要一次。循环条件少了一次加法。

上面代码每次复制一个16bit的值,总共四个字节要复制两次,考虑把这个地方优化一下。优化后的代码如下:

 

(转)一段代码优化的讨论 - 第66张  | 逗分享开发经验void CTestClass::SplitToEvenOddSeqs2(short *sp,TagDstData *dp,int evenLen,int oddLen)
(转)一段代码优化的讨论 - 第67张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第68张  | 逗分享开发经验
{
(转)一段代码优化的讨论 - 第71张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第72张  | 逗分享开发经验            
long *lSp = (long *)sp;
(转)一段代码优化的讨论 - 第73张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第74张  | 逗分享开发经验            
long *spEnd = (long *)(sp + (oddLen<<1));
(转)一段代码优化的讨论 - 第75张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第76张  | 逗分享开发经验            
long *lDp = (long *)dp;
(转)一段代码优化的讨论 - 第77张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第78张  | 逗分享开发经验            
(转)一段代码优化的讨论 - 第79张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第80张  | 逗分享开发经验            
while(lSp < spEnd){
(转)一段代码优化的讨论 - 第83张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第84张  | 逗分享开发经验                        
*lDp++ = *lSp++;
(转)一段代码优化的讨论 - 第85张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第86张  | 逗分享开发经验            }

(转)一段代码优化的讨论 - 第87张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第88张  | 逗分享开发经验            
if(oddLen < evenLen)
(转)一段代码优化的讨论 - 第89张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第90张  | 逗分享开发经验                        dp[evenLen].dp1 
= *((short *)lSp);
(转)一段代码优化的讨论 - 第91张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第92张  | 逗分享开发经验}

(转)一段代码优化的讨论 - 第93张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第94张  | 逗分享开发经验

这里先不考虑字节序的问题。

这样优化后和前面比较起来有那些改进?

1.循环体内只有一个指令;对于++运算,很多处理器都能很好处理。

2.循环条件检查只有一条比较指令

其实这里的检查的比较指令还可以优化一下,因为比较指令比较长,看一下下面的改进:

反正是四个字节的复制,不如下计算好复制的4个字节数量;再循环。

(转)一段代码优化的讨论 - 第95张  | 逗分享开发经验void CTestClass::SplitToEvenOddSeqs3(short *sp,TagDstData *dp,int evenLen,int oddLen)
(转)一段代码优化的讨论 - 第96张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第97张  | 逗分享开发经验
{
(转)一段代码优化的讨论 - 第100张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第101张  | 逗分享开发经验            
long *lSp = (long *)sp;
(转)一段代码优化的讨论 - 第102张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第103张  | 逗分享开发经验            
long *spEnd = (long *)(sp + (oddLen<<1));
(转)一段代码优化的讨论 - 第104张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第105张  | 逗分享开发经验            
long *lDp = (long *)dp;
(转)一段代码优化的讨论 - 第106张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第107张  | 逗分享开发经验            
long nDWORDs = oddLen>>1;
(转)一段代码优化的讨论 - 第108张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第109张  | 逗分享开发经验            
(转)一段代码优化的讨论 - 第110张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第111张  | 逗分享开发经验            
while(nDWORDs–){
(转)一段代码优化的讨论 - 第114张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第115张  | 逗分享开发经验                        
*lDp++ = *lSp++;
(转)一段代码优化的讨论 - 第116张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第117张  | 逗分享开发经验            }

(转)一段代码优化的讨论 - 第118张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第119张  | 逗分享开发经验            
if(oddLen - evenLen)
(转)一段代码优化的讨论 - 第120张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第121张  | 逗分享开发经验                        dp[evenLen].dp1 
= *((short *)lSp);
(转)一段代码优化的讨论 - 第122张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第123张  | 逗分享开发经验}

(转)一段代码优化的讨论 - 第124张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第125张  | 逗分享开发经验

写好上面四段代码,拿VS2005编译一下发现,测试代码如下:

 

(转)一段代码优化的讨论 - 第126张  | 逗分享开发经验void CompareData(TagDstData *spDst,short *pSrcTest)
(转)一段代码优化的讨论 - 第127张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第128张  | 逗分享开发经验
{
(转)一段代码优化的讨论 - 第131张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第132张  | 逗分享开发经验            
for(int i = 0;i<10240;i++)
(转)一段代码优化的讨论 - 第133张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第134张  | 逗分享开发经验            
{
(转)一段代码优化的讨论 - 第137张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第138张  | 逗分享开发经验                        
//if(spDst[0].dp1 )//if we access spDst here, the time will be longer
(转)一段代码优化的讨论 - 第139张  | 逗分享开发经验

(转)一段代码优化的讨论 - 第140张  | 逗分享开发经验                        
if(spDst[0].dp1 > pSrcTest[0]|| spDst[0].dp2 >pSrcTest[1])
(转)一段代码优化的讨论 - 第141张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第142张  | 逗分享开发经验                        
{
(转)一段代码优化的讨论 - 第145张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第146张  | 逗分享开发经验                                    printf(”
(转)一段代码优化的讨论 - 第147张  | 逗分享开发经验Split arithmetic 
is not right!\n”);
(转)一段代码优化的讨论 - 第148张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第149张  | 逗分享开发经验                                    
break;
(转)一段代码优化的讨论 - 第150张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第151张  | 逗分享开发经验                        }

(转)一段代码优化的讨论 - 第152张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第153张  | 逗分享开发经验                        pSrcTest 
+=2;
(转)一段代码优化的讨论 - 第154张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第155张  | 逗分享开发经验            }

(转)一段代码优化的讨论 - 第156张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第157张  | 逗分享开发经验                        printf(”
(转)一段代码优化的讨论 - 第158张  | 逗分享开发经验Split arithmetic 
is right!\n”);
(转)一段代码优化的讨论 - 第159张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第160张  | 逗分享开发经验}

(转)一段代码优化的讨论 - 第161张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第162张  | 逗分享开发经验
int _tmain(int argc, _TCHAR* argv[])
(转)一段代码优化的讨论 - 第163张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第164张  | 逗分享开发经验
{
(转)一段代码优化的讨论 - 第167张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第168张  | 逗分享开发经验            
int i,f ;
(转)一段代码优化的讨论 - 第169张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第170张  | 逗分享开发经验            
int now;
(转)一段代码优化的讨论 - 第171张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第172张  | 逗分享开发经验            CTestClass testClass;
(转)一段代码优化的讨论 - 第173张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第174张  | 逗分享开发经验            
short spSrc[20480];     
(转)一段代码优化的讨论 - 第175张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第176张  | 逗分享开发经验            
short spDst1[10240];
(转)一段代码优化的讨论 - 第177张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第178张  | 逗分享开发经验            
short spDst2[10240];
(转)一段代码优化的讨论 - 第179张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第180张  | 逗分享开发经验            TagDstData spDst[
10240];
(转)一段代码优化的讨论 - 第181张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第182张  | 逗分享开发经验            
short *pSrcTest = spSrc;
(转)一段代码优化的讨论 - 第183张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第184张  | 逗分享开发经验            memset(spSrc,
2,20480<<1);
(转)一段代码优化的讨论 - 第185张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第186张  | 逗分享开发经验            memset(spDst1,
0,10240<<1);
(转)一段代码优化的讨论 - 第187张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第188张  | 逗分享开发经验            memset(spDst2,
0,10240<<1);
(转)一段代码优化的讨论 - 第189张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第190张  | 逗分享开发经验            memset(spDst,
0,20480<<1);
(转)一段代码优化的讨论 - 第191张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第192张  | 逗分享开发经验            CStopWatch stop1;
(转)一段代码优化的讨论 - 第193张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第194张  | 逗分享开发经验            stop1.Start();
(转)一段代码优化的讨论 - 第195张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第196张  | 逗分享开发经验            
for(i = 0;i<100000; i++)
(转)一段代码优化的讨论 - 第197张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第198张  | 逗分享开发经验                        testClass.SplitToEvenOddSeqs(spSrc,spDst1,spDst2,
10240,10240);
(转)一段代码优化的讨论 - 第199张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第200张  | 逗分享开发经验            now 
= stop1.Now();
(转)一段代码优化的讨论 - 第201张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第202张  | 逗分享开发经验            printf(”time2 
=%d\n”,now);
(转)一段代码优化的讨论 - 第203张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第204张  | 逗分享开发经验            stop1.Start();
(转)一段代码优化的讨论 - 第205张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第206张  | 逗分享开发经验            
for(i = 0;i<100000; i++)
(转)一段代码优化的讨论 - 第207张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第208张  | 逗分享开发经验                        testClass.SplitToEvenOddSeqs(spSrc,spDst,
10240,10240);
(转)一段代码优化的讨论 - 第209张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第210张  | 逗分享开发经验            now 
= stop1.Now();
(转)一段代码优化的讨论 - 第211张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第212张  | 逗分享开发经验            printf(”time3 
=%d\n”,now);
(转)一段代码优化的讨论 - 第213张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第214张  | 逗分享开发经验            
for(i=0;i<20480;i++)
(转)一段代码优化的讨论 - 第215张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第216张  | 逗分享开发经验                        spSrc[i] 
= i;
(转)一段代码优化的讨论 - 第217张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第218张  | 逗分享开发经验            memset(spDst,
0,10240<<1);
(转)一段代码优化的讨论 - 第219张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第220张  | 逗分享开发经验            CStopWatch stop2;
(转)一段代码优化的讨论 - 第221张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第222张  | 逗分享开发经验            
for(f = 0;f<100000; f++)
(转)一段代码优化的讨论 - 第223张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第224张  | 逗分享开发经验                        testClass.SplitToEvenOddSeqs2(spSrc,spDst,
10240,10240);
(转)一段代码优化的讨论 - 第225张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第226张  | 逗分享开发经验            now 
= stop2.Now();
(转)一段代码优化的讨论 - 第227张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第228张  | 逗分享开发经验            printf(”time4 
=%d\n”,now);
(转)一段代码优化的讨论 - 第229张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第230张  | 逗分享开发经验            CompareData(spDst,pSrcTest);
(转)一段代码优化的讨论 - 第231张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第232张  | 逗分享开发经验            memset(spDst,
0,10240<<1);
(转)一段代码优化的讨论 - 第233张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第234张  | 逗分享开发经验            CStopWatch stop3;
(转)一段代码优化的讨论 - 第235张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第236张  | 逗分享开发经验            
for(f = 0;f<100000; f++)
(转)一段代码优化的讨论 - 第237张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第238张  | 逗分享开发经验                        testClass.SplitToEvenOddSeqs3(spSrc,spDst,
10240,10240);
(转)一段代码优化的讨论 - 第239张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第240张  | 逗分享开发经验            now 
= stop3.Now();
(转)一段代码优化的讨论 - 第241张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第242张  | 逗分享开发经验            printf(”time5 
=%d\n”,now);
(转)一段代码优化的讨论 - 第243张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第244张  | 逗分享开发经验            CompareData(spDst,pSrcTest);
(转)一段代码优化的讨论 - 第245张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第246张  | 逗分享开发经验            
return 0;
(转)一段代码优化的讨论 - 第247张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第248张  | 逗分享开发经验}

(转)一段代码优化的讨论 - 第249张  | 逗分享开发经验
(转)一段代码优化的讨论 - 第250张  | 逗分享开发经验

注:其中CStopWatch是我写的用来计算时间的类。

如果把CompareData中访问spDst的代码注释掉,运行的结果:

Intel® Core™2 CPU 6400 2.13Ghz 1GB

time2 =753945 us

time3 =494852 us

time4 =0 us

time5 =0 us

Intel® Core™2 Duo CPU T7250 @2.00GHz 2.00 GHz 2GB

Time2 = 847431 us

Time3=523269 us

Time4=1 us

Time5 =1 us

Pentium® 4 CPU 2.6 GHz  512MB

Time2 = 613622 us

Time3=616545 us

Time4=1 us

Time5 =1 us

如果使用VC6编译,各种运行结果如下:

Intel® Core™2 CPU 6400 2.13Ghz 1GB

time2 =2041530 us

time3 =1352753 us

time4 =930849 us

time5 =501492 us

Intel® Core™2 Duo CPU T7250 @2.00GHz 2.00 GHz 2GB

time2 =1878766 ustime3 =1380009 ustime4 =959918 us

time5 =523022 us

Pentium® 4 CPU 2.6 GHz  512MB

time2 =2098438 us

time3 =1855219 us

time4 =1068678 us

time5 =610458 us

再把CompareData还原,在VC2005中编译,执行结果如下:

Intel® Core™2 CPU 6400 2.13Ghz 1GB

time2 =1007759 us

time3 =1364986 us

time4 =876046 us

time5 =437623 us

Intel® Core™2 Duo CPU T7250 @2.00GHz 2.00 GHz 2GB

time2 =1103970 ustime3 =1403941 ustime4 =630279 ustime5 =313330 us 

Pentium® 4 CPU 2.6 GHz  512MB

time2 =1218860 ustime3 =1743361 ustime4 =478785 us

time5 =241885 us

使用VC6重新编译:

Intel® Core™2 CPU 6400 2.13Ghz 1GB

time2 =2026392 us

time3 =1359155 us

time4 =946604 us

time5 =511307 us

Intel® Core™2 Duo CPU T7250 @2.00GHz 2.00 GHz 2GB

time2 =1921379 ustime3 =1410035 ustime4 =967616 ustime5 =528601 us 

Pentium® 4 CPU 2.6 GHz  512MB

time2 =2089173 ustime3 =1849719 ustime4 =1062956 ustime5 =610357 us 

当然这里有重复运算对算法的运行时间的影响;但考虑所有的算法都是对同样的内存操作,不考虑。那么我们发现的就是算法的效率提高是明显的。算法运行时间缩短为原来的1/31/4 

另外有几个问题需要在这里讨论一下:

1.演示了时间问题的同时,还看到一个奇怪的问题就是如果注释了CompareData,在VC2005上得到的后面两个算法的时间几乎为0。为什么?而VC6的编译没有这样的现象?

2.VC6上编译得到的结果与VC2005编译得到的结果相比,VC2005结果更好,为什么?(这个很弱智了)

3.我觉得程序还可以再优化,怎么样做?

欢迎大家就这个简单的优化问题,提出讨论。

最后编辑:
作者:搬运工
这个作者貌似有点懒,什么都没有留下。