【问题标题】:Extra computation steps on adding brackets?添加括号的额外计算步骤?
【发布时间】:2016-01-28 14:01:16
【问题描述】:

好的,所以在编写一些代码时,我脑海中突然出现了一个问题。 CPU会计算这个吗

gap = (gap*3) + 1;

与下面不带括号的表达式一样的效率?

gap = gap*3 + 1;

更新更清晰:

通常在编写算术表达式时,我们倾向于添加括号以使代码更易于阅读,即使括号不会改变表达式的计算结果。那么问题来了,添加这样的括号对性能有影响吗?

【问题讨论】:

  • 看看运算符优先级/操作顺序 - 在您的示例中,乘法无论如何都会先行。 CPU 不会像您发布的那样直接执行表达式,而是执行指令。这取决于编译器将源代码翻译成什么。无论如何,括号会我“删除”。对于您的示例,应该没有任何区别(尝试并编译)。根据您的架构,这甚至可以在一条指令中完成(乘法、加法)。
  • 谢谢。我更新了问题以更好地解释它。
  • 在您的示例中,两种计算的结果是相同的。为获得这些结果而执行的计算(执行的指令)是相同的,因此性能相同。数据依赖没有改变。
  • 好吧,我可能出乎意料地不对(在你的例子上测试它)!欢迎其他cmets。
  • 我将您的程序编写为 C 代码,并比较了汇编代码和二进制程序。它仅因文件名而异,如果您愿意,我可以添加代码作为答案。但我不确定这是否对你很有帮助。

标签: arithmetic-expressions processing-efficiency


【解决方案1】:

如上面在 cmets 中提到的:

文件 test1.c:

int main(void)
{
    int gap = 1;
    gap = (gap*3) + 1;
    return gap;
}

文件 test2.c:

int main(void)
{
    int gap = 1;
    gap = gap*3 + 1;
    return gap;
}

使用gcc 及其-S 选项(“仅编译;不汇编或链接”):gcc -S test1.c && gcc -S test2.c。比较这两个文件:

$ diff test1.s test2.s
1c1
<   .file   "test1.c"
---
>   .file   "test2.c"

(即只有第一行的文件名不同)

如果您仍然不相信我(对于这个特定示例),那么您可以进一步编译和组装:gcc test1.c -o test1 &amp;&amp; gcc test2.c -o test2。比较那些二进制文件(或者更确切地说是 ELF 可执行文件)会给你一个字节的差异,即文件名:

$ hexdump -C test1 > hex1.txt && hexdump -C test2 > hex2.txt
$ diff hex1.txt hex2.txt 
387c387
< 00001fc0  79 5f 65 6e 74 72 79 00  74 65 73 74 31 2e 63 00  |y_entry.test1.c.|
---
> 00001fc0  79 5f 65 6e 74 72 79 00  74 65 73 74 32 2e 63 00  |y_entry.test2.c.|

【讨论】:

    猜你喜欢
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2019-10-04
    • 1970-01-01
    • 2016-10-16
    • 2011-05-28
    • 2020-10-11
    相关资源
    最近更新 更多