1

假设我们有一个负整数,比如 int a;

-a 有更快的实现吗?

我必须对此进行一些按位运算吗?

4

7 回答 7

26

几乎可以肯定,没有什么比您的编译器最有可能将其转换成的机器代码 NEG 指令更快的了。

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

对于二进制补码数,您不能将其加 1,但这几乎肯定会变慢。但我不完全确定 C/C++ 标准要求使用二进制补码(它们可能,我没有检查过)。

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

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

<微妙的幽默或我的妻子所说的不有趣>

    486 上的 NEG(我上次不得不担心时钟周期时的最新技术)需要 3 个时钟周期(内存版本,寄存器只需要 1 个)-我假设以后的芯片会相似。在 3Ghz CPU 上,这意味着您每秒可以执行 10 亿次此类操作。这还不够快吗?

</subtle-humor-or-what-my-wife-calls-unfunny>

于 2009-03-19T02:16:53.020 回答
8

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

于 2009-03-19T02:24:42.907 回答
7

为了澄清 Pax 的声明,

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

简而言之,没有比 -a 更快的方法了;即使有,它也不会是便携式的。还要记住,过早的优化是邪恶的。首先分析您的代码,然后处理瓶颈。

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

于 2009-03-19T02:28:31.353 回答
2

就 CPU 硬件而言,取反是一个非常简单的操作。我不知道有一个处理器需要更长的时间来进行否定而不是进行任何按位运算 - 其中包括一些 30 年历史的处理器。

只是好奇,是什么让你问这个问题?这当然不是因为您检测到了瓶颈。

于 2009-03-19T03:02:02.023 回答
1

也许您应该考虑优化您的算法,而不是像这样的小事。如果这是优化的最后一件事,那么您的代码将尽可能快。

于 2009-03-19T02:33:46.910 回答
1

所有好的答案。

如果(-a)有所作为,您已经进行了一些非常激进的性能调整。

对程序进行性能调优就像从湿海绵中取水一样。作为第一次编写程序,它非常潮湿。稍加努力,您就可以节省一些时间。用更多的努力,你可以把它弄干一些。

如果你真的很坚持,你可以把它放在你必须把它放在烈日下的地方,以从中获得最后的几个时间分子。

那是(-a)可能会有所作为的水平。

于 2009-03-19T11:59:41.013 回答
0

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

于 2009-03-19T02:14:45.023 回答