负整数的C ++优化

时间:2009-03-19 02:12:25

标签: c++ c optimization micro-optimization

让我们说我们有一个负整数说 int a;

是否有更快的实施 -a?

我必须对此进行一些按位操作吗?

7 个答案:

答案 0 :(得分:26)

几乎可以肯定没有什么比机器代码NEG指令更快,你的编译器很可能会把它变成。

如果有,我确信编译器会使用它。

对于二进制补码,你不能加1,但几乎可以肯定会慢一些。但我不完全确定C / C ++标准要求使用二进制补码(他们可能,我没有检查)。

我认为这个问题属于那些试图重写strcpy()等以获得更快速度的问题。那些人天真地认为C库strcpy()尚未通过使用特殊的机器代码指令进行大量优化(而不是大多数人第一次尝试的简单循环)。

您是否进行了性能测试,这些测试似乎表明您的否定时间过长了?

<微妙幽默或 - 什么-我的妻子通话-无趣>

    关于486的NEG(最后一次我不得不担心的现状) 关于时钟周期)需要3个时钟周期(内存版本, 注册只需1) - 我假设后来的芯片将是 类似。在3Ghz CPU上,这意味着你可以做10亿 这些每一秒。这还不够快吗?

< /微妙幽默或 - 什么-我的妻子通话-无趣>

答案 1 :(得分:8)

你有没有听说过“过早优化”这个词?如果您已经优化了所有代码,那么这是唯一剩下的,很好。如果没有,你就是在浪费时间。

答案 2 :(得分:7)

澄清Pax的陈述,

除了1个案例外,C ++编译器不被强制使用二进制补码。将有符号类型转换为无符号类型时,如果数字为负数,则转换结果必须是整数的2的补码表示。

简而言之,没有比-a更快的方法;即使有,它也不会便携。 请记住,过早优化是邪恶的。首先描述您的代码,然后解决瓶颈问题。

参见 C ++编程语言,第3版。,第C.6.2.1节。

答案 3 :(得分:2)

在CPU硬件方面,否定数字是一项非常简单的操作。我不知道处理器需要做更多的否定而不是进行任何按位操作 - 包括一些30年前的处理器。

只是好奇,是什么让你问这个问题?当然不是因为你发现了瓶颈。

答案 4 :(得分:1)

也许您应该考虑更多地优化算法,而不是像这样的小事。如果这是最后一件要优化的事情,那么你的代码就会达到最快的速度。

答案 5 :(得分:1)

所有好的答案。

如果(-a)有所作为,那么您已经做了一些非常积极的性能调整。

调整程序的性能就像从潮湿的海绵中取水一样。由于程序是第一次编写,它很潮湿。只需一点努力,你就可以抽出一些时间。通过更多的努力,你可以将它干掉一些。

如果你真的坚持不懈,你可以把它放到你必须把它放在炎热的太阳下的地方,以便从它的最后几分钟中分离出来。

这是(-a)可能产生影响的水平。

答案 6 :(得分:0)

您是否看到了否定数字的性能问题?我很难想到大多数编译器会对整数进行逐位操作来否定它们。