之前看到我同学有关各编程语言性能比较的文章:
原文http://blog.youkuaiyun.com/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毫秒...