有没有更有效的方法来计算减法表达式的绝对值
Posted
技术标签:
【中文标题】有没有更有效的方法来计算减法表达式的绝对值【英文标题】:Is there a more efficient way to calculate the absolute value of a subtraction expression 【发布时间】:2014-12-09 06:47:38 【问题描述】:这个问题几乎说明了一切。目前,我使用Math.Abs(a - b)
来计算减法表达式的绝对值,例如5 - 10
和10 - 5
都返回5
。
有没有更有效的方法来做到这一点,或者这是最有效的方法?
【问题讨论】:
对此的任何改进很可能都是微不足道的。我坚持这一点,而不是试图重新发明***。 内置函数通常尽可能高效。我想你正在使用的编译器在效率方面起着更重要的作用。 是的,有几种方法,但你应该考虑汇编语言。 你一直在使用 Int32 吗? 你说的更高效是什么意思? 【参考方案1】:在您确切知道问题出在哪里之前,请不要对您的代码进行微优化。
您可以自己实现一个并使其成为内联函数,以使用MethodImplAttribute 降低函数调用的成本。
如果您使用的是 Int32 值并且您的输入恰好不是边界值,那么您可以使用它
Abs(x) = (x ^ (x >> 31)) - (x >> 31)
但我建议你忘记这一切,分析你的应用程序,你会发现真正的问题不在调用 Math.Abs
的地方,你应该总是先让你的代码可读,然后在你证明它们之后调整性能问题真的是性能问题!
程序员会浪费大量时间思考或担心 关于,他们程序的非关键部分的速度,以及这些 提高效率的尝试实际上会产生强烈的负面影响 考虑调试和维护。我们应该忘记小 效率,大约 97% 的时间:过早优化是 万恶之根。然而,我们不应该放弃我们在这方面的机会 关键 3%。 (DonaldKnuth 的论文《StructuredProgrammingWithGoToStatements》)
请阅读this
【讨论】:
同意。我是一名游戏开发人员,我从来不需要优化绝对值计算。 (但如果我在做图形编程,那将是一个完整的“另一种动物”。) 甚至在图形中,重新排序指令并选择正确的数据类型组合将比另一种执行 abs 的方式更有益。 :) 计算该表达式是概率。比x>=0 ? x : -x
慢,它可以编译为(edi 中的输入/eax 中的输出):xor eax, eax / sub eax, edi / cmovle eax, edi
on x86。关键路径上的 2 条指令,均具有低延迟。 cmovLE = 如果之前的比较小于或等于,则为条件复制。 (即如果0 <= input
,output=input
,否则保留也用作比较的0-output
。) Hrm,clang 使用我的想法,gcc 使用您的 xor/shift/sub。 ICC 使用cltd
将输入的符号位复制到另一个寄存器的每一位,而不是移位。 goo.gl/Lj9JeR.以上是关于有没有更有效的方法来计算减法表达式的绝对值的主要内容,如果未能解决你的问题,请参考以下文章