1

以下两种情况之间是否有任何性能差异:
首先:

int test_some_condition(void);

if( some_variable == 2 && test_some_condition())
{
    //body
}

第二:

int test_some_condition(void);

if( some_variable == 2 )
{
    if(test_some_condition())
    {
        //body
    }
}

更新:我知道如何创建测试并测量每个案例的性能或查看为每个案例生成的组件,但我确信我不是第一个遇到这个问题的人,如果有人有已经测试过,可以是我一个简单的是/否答案。

4

6 回答 6

4

区别在什么方面?

可读性?是的,有区别。第一个更清晰,更好地表达了您的意图。而且它在编辑器中占用的行数也更少,这本身并不一定是一个优势,但它确实使代码更容易阅读,并且对于任何落后并想要编辑它的人来说一目了然。

性能/“速度”?不。我愿意用实际的钱打赌,一旦您通过打开优化的编译器运行这两个代码片段,绝对没有明显的区别。即使在禁用优化的情况下,也不会花费太多时间来说服我押注相同的情况。

为什么?因为在 C(以及我所知道的所有 C 派生语言)中,&&运算符执行短路评估,这意味着如果第一个条件评估为 false,那么它甚至不需要评估第二个条件,因为整个陈述不可能是真的。

if在 VB 6 糟糕的过去,当And操作员不执行短路评估时,嵌套语句是一种常见的“优化”技巧。我无法想象在 C 代码中使用它的目的,除非它增强了可读性。老实说,如果您遇到的编译器在性能方面无法完全渲染这两个代码片段,那么是时候扔掉该编译器并停止使用它了。这是最基础的优化,是编译器编写者的“唾手可得的果实”。如果他们不能做到这一点,我不会相信他们与您的其余代码。

但是,总的来说,担心这类事情(肯定属于“微优化”的范畴)并不能帮助您编写更好的代码或成为更好的程序员。这只会让您浪费大量时间在 Stack Overflow 上提问,并为像我这样每周对 2 到 3 个类似问题发布相同答案的用户的声誉做出贡献。那是你花在编写代码和以切实的方式提高技能的时候了。

于 2011-06-29T12:36:25.797 回答
2

任何人都可以用现代编译器真正分辨的唯一方法是查看机器代码。

于 2011-06-29T12:29:53.190 回答
2

应该没有区别。如果存在差异,则可能无法测量(即使您这样做了数百万次,也不会得到确凿的结果)。

于 2011-06-29T12:31:38.133 回答
1

在运行 10.000.000 次的循环中测试这两个示例给出:

$ time ./test1

real    0m0.045s
user    0m0.044s
sys     0m0.001s

$ time ./test2

real    0m0.045s
user    0m0.043s
sys     0m0.003s

另外,请记住,如果表达式的第一部分失败,则永远不会计算第二个表达式。这在第一个例子中可能不是很清楚。

此外,在第一个评估表达式返回 false 的情况下:

$ time ./test1_1

real    0m0.035s
user    0m0.034s
sys     0m0.001s
$ time ./test2_1

real    0m0.035s
user    0m0.034s
sys     0m0.000s
于 2011-06-29T12:39:41.587 回答
0

这两个样本在逻辑上是等价的,前提是复合条件是惰性求值的,这意味着 in a && b,在已知为假b时不会求值。a因此,即使存在差异,我也不会在意,因为这可能是您正在使用的编译器的人工制品(或错误),并且可能会随着下一个版本或错误修复而改变。

于 2011-06-29T12:35:50.437 回答
0

如果您正在考虑第一个版本是否总是调用test_some_condition但第二个版本仅在第一个条件为真时才调用它,那么答案是两个版本是等价的,因为 AND 运算符是惰性的,如果第一个是已经是假的了。

该标准保证了这种行为。这使得合法地说:

if (array_size > n && my_array[n] == 1) { ... }

如果没有惰性保证,这将是损坏的代码。

于 2011-06-29T12:34:32.633 回答