让我们说我们有一个负整数说 int a;
是否有更快的实施 -a?
我必须对此进行一些按位操作吗?
答案 0 :(得分:26)
几乎可以肯定没有什么比机器代码NEG指令更快,你的编译器很可能会把它变成。
如果有,我确信编译器会使用它。
对于二进制补码,你不能加1,但几乎可以肯定会慢一些。但我不完全确定C / C ++标准要求使用二进制补码(他们可能,我没有检查)。
我认为这个问题属于那些试图重写strcpy()
等以获得更快速度的问题。那些人天真地认为C库strcpy()
尚未通过使用特殊的机器代码指令进行大量优化(而不是大多数人第一次尝试的简单循环)。
您是否进行了性能测试,这些测试似乎表明您的否定时间过长了?
<微妙幽默或 - 什么-我的妻子通话-无趣>
< /微妙幽默或 - 什么-我的妻子通话-无趣>
答案 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)
您是否看到了否定数字的性能问题?我很难想到大多数编译器会对整数进行逐位操作来否定它们。