VC性能优化的一点心得

本文深入探讨了一篇关于C++性能比较的文章中提到的递归优化现象,通过实验证明了在特定优化环境下,递归计算耗时仅为0毫秒的原理,并分析了不同编译模式下的汇编代码差异。进一步修改代码加入结果赋值操作,展示了在优化后的C++环境中,递归计算时间和非优化情况下的显著差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

原文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毫秒...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值