【问题标题】: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 - 1010 - 5 都返回5

有没有更有效的方法来做到这一点,或者这是最有效的方法?

【问题讨论】:

  • 对此的任何改进很可能都是微不足道的。我坚持这一点,而不是试图重新发明轮子。
  • 内置函数通常尽可能高效。我想你正在使用的编译器在效率方面起着更重要的作用。
  • 是的,有几种方法,但你应该考虑汇编语言。
  • 你一直在使用 Int32 吗?
  • 你说的更高效是什么意思?

标签: c# .net performance subtraction absolute-value


【解决方案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 <= inputoutput=input,否则保留也用作比较的0-output。) Hrm,clang 使用我的想法,gcc 使用您的 xor/shift/sub。 ICC 使用cltd 将输入的符号位复制到另一个寄存器的每一位,而不是移位。 goo.gl/Lj9JeR.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多