背景
我是一名航空航天工程和 EECS 学生。我正处于接触大量数学和物理学的阶段,但还没有接触算法或汇编语言。
我设计和编写的程序种类繁多,从商业提案软件到卫星硬件 Controller ,应有尽有。
这项工作的大部分涉及在其他媒介中进行数学计算,然后编写代码来实现它。
在将它们转化为代码之前,我用代数方法简化了这些方程式。但在我花时间这样做之前,我想知道我应该支持更多的加法运算,还是更多的乘法运算。 (我已经知道除法的成本要高得多。)
例子
这是我从其他一些工作中推导出的方程式,这是我所看到的非常典型的方程式。
我们可以清楚地看到,至少有几种方法可以简化这个等式。由于简化由我自行决定,因此我想选择既有利于性能又实用的选项。我不会以算法设计时间为代价来追求前沿性能。
问题
一般来说,哪个双运算更快:加法还是乘法?
我知道知道哪个更快的唯一明确方法是编写和运行基准测试,但这不是这里的重点。 在我所做的工作中,这不是一个足够高的优先级来证明每次我需要简化方程时编写测试代码是合理的。我需要的是一个应用于我的代数的经验法则。
如果差异很小以至于可以忽略不计或不确定,那么这是一个可以接受的答案,只要我知道它几乎没有什么区别。
支持研究
我知道,在 C 和 C++ 中,the optimizer takes care of the algebra ,所以这是一个空问题。但是,据我了解,the Java compiler does not do algebraic simplification/optimization .具体来说,this answer表明情况确实如此,程序员应该进行这种优化。
互联网上对此有零散的答案,但我无法得出结论性的答案。 A former University of Maryland physics student在 Java 上运行这些测试,但表中没有双倍性能数据,并且图表比例使结果难以辨认。 This University of Quebec CS professor's tests仅显示整数运算的结果。 This SO answer解释说,在硬件层面上,乘法是一种更复杂的运算,但我也知道工程师在设计处理器时会考虑这些问题。
其他边际有用的链接:
最佳答案
一般来说,你应该写最清晰的代码。 JIT(不是 javac)采用简单、通用的模式并对其进行优化。这意味着使用简单、通用的模式通常是优化代码的最佳方式。
如果您分析您的应用程序并发现代码没有以最佳方式运行,您可以尝试自己优化代码;
- 很难编写有意义的微基准。
- 结果可能对环境高度敏感。更改 Java 或 CPU 模型的更新,您可能会得到冲突的结果。
- 当您对整个代码进行性能测试时,您可能会发现延迟不是您预期的那样。例如,他们经常在 IO 中。
除非您确信优化确实有帮助,否则您应该坚持使用最简单和最容易维护的代码,并且您可能会发现它运行得足够快。
关于java - 双倍乘法与加法速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38963570/