所有语言 - 程序效率

时间:2010-08-20 13:19:38

标签: language-agnostic performance

考虑这些选项

if(successful)
{
    if(condition)
    {
       //do something
    }
    if(condition)
    {
       //do something
    }
    ...
}

if(successful)&&(condition)
{
   //do something
}
if(successful)&&(condition)
{
   //do something
}
...

想象一下有100条if语句。

效率有什么不同吗?

提前致谢。

4 个答案:

答案 0 :(得分:10)

这有两个正确的答案。其他一切都是无稽之谈。

  1. 不要担心像这样的微优化,除非你已经证明了它们的需要。这只能通过测量并确认您正在查看的代码是瓶颈来完成。 (提示:你对这类问题的直觉几乎,但并不完全,总是错误的。)
  2. 如果您已成功证明您的代码是瓶颈,请尝试两种方法并测量结果。除非碰巧在相同的操作系统上运行相同的硬件并使用相同的编译器进行编译,否则这里没有人能够为您回答这个问题。
  3. 首先让您的代码正确无误。然后测量它的性能。然后根据需要优化 。其他一切都是无稽之谈。

答案 1 :(得分:8)

这一切都取决于评估successful表达式的成本。

您还应注意,这两个版本在语义上不相同,因为if-expression的评估可能有副作用 1

如果您实际遇到性能问题,那么测量,不要猜测。测量将是了解性能真实情况的唯一方法。

1 要从评论中解释一个问题,这里有一个简单的例子,你会得到不同的行为:

方法CreateProcess具有启动新流程的副作用,并通过返回true来指示成功创建:

bool CreateProcess(string filename, out handle) { ... } 

if (CreateProcess("program.exe", out handle))
{   
    if (someCondition)
    {
         handle.SomeMethod(...);
    }
    if (someOtherCondition)
    {
         handle.SomeOtherMethod(...);
    }
}

这与以下内容截然不同:

if (CreateProcess("program.exe", out handle) && someCondition)
{
    handle.SomeMethod(...);
}
if (CreateProcess("program.exe", out handle) && someOtherCondition)
{
    handle.SomeOtherMethod(...);
}

答案 2 :(得分:1)

两者都是O(1)。其他任何东西取决于你使用的语言/编译器/优化器。

答案 3 :(得分:0)

首先我要说明我完全同意JMcO

然而,我发现考虑这些差异会很有趣。 (可能是因为我在编译器上工作,其中关于优化(输出)的声明必须事先完成,而不是基于测量,而是基于编译器的一般用途的假设/知识)

你的问题没有一个答案,只有很多方面可能会影响你的表现。

  • 是成功的值或方法调用
  • 编译器是否为&&和操作(如果lhs为假,则挽救)或者总是评估&&
  • 的左右两侧
  • 处理器使用什么样的分支预测?
  • 编译器如何处理复合条件与嵌套?编译器可能会为您提供的两个示例生成相同的二进制文件,尽管它最不喜欢(当编译器可以验证外部条件没有副作用时)
  • 编译器执行哪些优化?他们中的一些人是否可以从根本上改变二进制文件(例如,如果可以发现它是恒定的,或者至少在手头之前已知,则跳过这个条件?)

列表可能会延长,但我的观点是尽管考虑可能影响性能的因素而不了解构建和执行环境,但基本上无法预测性能会很有趣