C++ 如何确定C+的复杂性(如CPU周期)+;VisualStudio2008的代码

C++ 如何确定C+的复杂性(如CPU周期)+;VisualStudio2008的代码,c++,visual-studio,optimization,C++,Visual Studio,Optimization,我经常需要编写代码来优化性能,对于一个特定的问题,我通常有几种解决方案 是否有一种简单的方法来确定特定语句/函数将占用的CPU周期数?我不是在讨论访问文件系统、Windows API或网络的复杂代码,我是在讨论半条C++代码来确定哪个代码更有效。 经典的例子是比较++i和i++。前者速度更快,但我不知道,我怎么能自己确定呢 我不想安装昂贵的性能工具(例如英特尔的工具),而是想找到一种简单的方法来了解情况。是否有一种方法可以看到由C++代码生成的汇编代码——而不需要调试?< /P> 当然欢迎任何其

我经常需要编写代码来优化性能,对于一个特定的问题,我通常有几种解决方案

是否有一种简单的方法来确定特定语句/函数将占用的CPU周期数?我不是在讨论访问文件系统、Windows API或网络的复杂代码,我是在讨论半条C++代码来确定哪个代码更有效。 经典的例子是比较++i和i++。前者速度更快,但我不知道,我怎么能自己确定呢

我不想安装昂贵的性能工具(例如英特尔的工具),而是想找到一种简单的方法来了解情况。是否有一种方法可以看到由C++代码生成的汇编代码——而不需要调试?< /P>
当然欢迎任何其他建议和/或方法。

使用Visual Studio提示符,您可以调用
cl.exe(VC++)编译器并使用该选项生成程序集列表

生成一个名为
mycode.asm
的文件,其中包含清单,看起来类似于:

; Line 16
    push    ebp
    mov ebp, esp
; Line 17
    cmp DWORD PTR _argc$[ebp], 2
    jl  SHORT $LN2@main
    cmp DWORD PTR _argc$[ebp], 2
    jle SHORT $LN3@main
$LN2@main:
; Line 19
    push    OFFSET $SG2660
    call    _puts
    add esp, 4
。。。等等

类似地,如果您在VS中放置断点并打开反汇编,您将看到程序集列表(如果情况正确,调试模式可能应该处于启用状态)


这可能也很有趣:

我知道你说过你不想为性能工具付费,但我强烈建议你看看

我知道它可能很贵,但值得投入每一分钱。它能够很好地分析代码,例如分配、性能和许多其他方面

我真的无法想象自己没有这个工具会工作。我也不为你工作。我只是一个超级粉丝

我想的是:既然我们有很好的工具来阅读和调试汇编,为什么还要有人费心去阅读和调试汇编呢?如果你有合适的工具并专注于业务,你的时间会更有效率

只有我的2美分。

你的++i与i++的“经典例子”通常是无关紧要的。优化编译器足以避免这一问题。事实上,他们非常擅长编写看起来很慢很快的代码

看看算法的复杂性:通常,如果代码出人意料地慢,那么在某个内部循环中就有一个隐藏的O(n)

以前说过,个人资料,个人资料,个人资料。由于缓存的重要性,计数周期现在就不那么重要了。微基准有时适用于小块代码,但通常不能代表它们在应用程序中的性能

VisualStudio有一个内置的分析器,如下所述:这正是您真正需要的


不要选择效率更高的代码。选择可读性更高的代码。

不,使用今天的CPU,您无法将其视为汇编代码并告诉它需要多长时间。想想缓存、分支预测、管道等等。如果你不得不问这样的问题,你可能没有机会通过这种方式获得任何重要的信息。在大多数情况下,了解什么运行得快的唯一可靠/实用的方法是,您知道,实际运行它并查看它需要多长时间(即,分析和基准测试)。这甚至没有涉及到你是否应该尝试。@delnan我完全同意。如果我担心这一点(几乎从来没有),我会把它包在一个(稍微展开的)环中,然后秒表。如果你执行它10^9次,那么秒就转化为纳秒。在某些情况下,++i与i++并不无关。对于基本类型,优化器将捕获它。对于更复杂的迭代器,它可能无法在递增之前丢弃存储原始值的指令。否则答案很好。谢谢,我会看一看剖析器-出于某种原因,我实际上没有意识到这一点,我认为它只适用于C。我不完全同意不写高效的代码——如果我写的网络服务器每秒处理10000个数据包,那么我想让它更高效:-)是的,你有点问题了。我在开发附加组件方面总是有平庸的经验,但它们的价格并非完全不合理。我一定会看一看。它不是一个附加组件。这是一个应用程序。你可以下载30天试用版,自己看看。我用错了词。作为“附加组件”,我指的是我的开发环境的通用“附加组件”。我意识到这是一个独立的应用程序。我会看看的,谢谢。我决定试试这个产品,但我一点也不满意。客户经理无法回复我的电子邮件,而且我认为该产品使用起来相当麻烦。谢谢,我接受了你的回答,因为它基本上回答了我的问题。但我意识到,多亏了其他评论,这可能是一种乏味且不准确的处理方式。谢谢大家的意见。
; Line 16
    push    ebp
    mov ebp, esp
; Line 17
    cmp DWORD PTR _argc$[ebp], 2
    jl  SHORT $LN2@main
    cmp DWORD PTR _argc$[ebp], 2
    jle SHORT $LN3@main
$LN2@main:
; Line 19
    push    OFFSET $SG2660
    call    _puts
    add esp, 4