VC性能优化的一点心得

来源:互联网 发布:华视微讯网络摄像机 编辑:程序博客网 时间:2024/04/30 02:58

之前看到我同学有关各编程语言性能比较的文章:

原文http://blog.csdn.net/lee353086/article/details/49402015

比较后结果

我只是对C++ 速度最优情况下递归用时0毫秒比较感兴趣:

我拿来了他的代码试了一下,C++最优果然是0毫秒,无论递归多少层都是0...
我同学的源码类似如下(只测试递归部份):

#include "stdafx.h"   
#include <time.h>    
#include <iostream>  
using namespace std;  
  
int FibonacciSequence(int item)  
{  
    if (item == 0)  
        return 0;  
    else if (item == 1)  
        return 1;  
  
    return FibonacciSequence(item - 1) + FibonacciSequence(item - 2);  

int _tmain(int argc, _TCHAR* argv[])
{
clock_t t1 = clock();
FibonacciSequence(35);
clock_t t2 = clock();
std::cout << "Time elapse:" << t2 - t1 << std::endl;

return 0;
}
//////////
为了解开0毫秒的奥秘,我查看了一下在DEBUG(无优化选项)和RELEASE(加最快速度优化选项/O2)其生成的汇编代码:
;DEBUG 下
...
mov esi, esp
call DWORD PTR __imp__clock
cmp esi, esp
call __RTC_CheckEsp
mov DWORD PTR _t1$[ebp], eax
; 25   : FibonacciSequence(35);


push 35; 00000023H
call ?FibonacciSequence@@YAHH@Z; FibonacciSequence
add esp, 4


; 26   : clock_t t2 = clock();


mov esi, esp
call DWORD PTR __imp__clock
...
期间很时显调用了FibonacciSequence(35),也就是那个 call?FibonacciSequence@@YAHH@Z


再看看 RELEASE下的汇编代码:
...
call DWORD PTR __imp__clock
mov edi, eax


; 25   : FibonacciSequence(35);
; 26   : clock_t t2 = clock();


call DWORD PTR __imp__clock
...
直接忽略了CALL,并没有调用递归计算的函数....
////////////////
我把他的代码改了一下,加一个赋值:
clock_t t1 = clock();
FibonacciSequence(35);
clock_t t2 = clock();
std::cout << "Time elapse:" << t2 - t1 << std::endl;
改成:
clock_t t1 = clock();
int nResult = FibonacciSequence(35);
clock_t t2 = clock();
std::cout <<"Result:"<<nResult<<"\r\n"<<"Time elapse:" << t2 - t1 << std::endl;
在RELEASE速度最优下输出:
Result:9227465
Time elapse:74
终于不是0了,不过也蛮快了,DEBUG没优化要800+毫秒,优化后居然是74毫秒
再看一下加赋值后的汇编代码:
...
; 23   : clock_t t1 = clock();


call DWORD PTR __imp__clock
mov ecx, 34; 00000022H
mov DWORD PTR _t1$1$[esp+16], eax
call ?FibonacciSequence@@YAHH@Z; FibonacciSequence
mov ecx, 33; 00000021H
mov ebx, eax
call ?FibonacciSequence@@YAHH@Z; FibonacciSequence
mov esi, eax


; 24   : int nResult = FibonacciSequence(35);
; 26   : clock_t t2 = clock();


call DWORD PTR __imp__clock
...
有调用 FibonacciSequence(35)了
看来微软的C++编译器是偷了个懒,之前的递归算法计算结果并没有在其他地方使用,所以直接把它优化掉了,所以无论参数是多少大,计算递归所有时间永远是0毫秒...

0 0
原创粉丝点击