Quick Java Optimization Question

后端 未结 3 434
南旧
南旧 2021-01-05 00:00

Will the Eclipse compiler automatically convert multiplication by a power of two into a bit shift, or should I do that manually? Thanks for the help.

相关标签:
3条回答
  • 2021-01-05 00:34

    Short answer: No. The source code compiler won't replace a multiplication by two with a bit shift.

    Long answer: It won't, because it can't know if a bit shift is faster than a multiplication on the platform the code eventually will be running. So, the question should rather be if a specific VM will replace the multiplication with a bit shift, and it probably will. I experimented a little bit with this to optimize a code block and it's interesting that Sun's Hotspot shows different behaviour here, depending on if the program runs on an AMD or on an Intel CPU (at least with the CPUs I tested). In either case, a multiplication with a power of two is replaced with a bit shift, but for multiplications with a power of two +/- 1 (3, 5, 7, 9, 15, 17, ...), Hotspot will generate a bit shift and an addition or a subtraction for Intel CPUs, while generating a multiplication for AMD CPUs, since the AMD CPU executes a multiplication much faster than the Intel CPU. It's of course possible, that this behaviour differs between different CPU models from each vendor.

    If you are interested in knowing what the VM actually is doing, it is quite benefical to get the debug build of jdk7 and enable dumps of the assembler code generated by the Hotspot compiler.

    0 讨论(0)
  • 2021-01-05 00:41

    In general you cannot outsmart the JVM unless there is something very high level you know that cannot be deduced automatically. This usually means a better algorithm is available than the one which is currently used instead of having to handtweak your source. You can use the jvisualvm profiler available in the latest Java 6 JDK's to investigate your program and see where the bottlenecks are.

    For instance, the expense of creating new objects instead of reusing old ones has diminished radically then last 10 years, so you should not take any old advice for tuning your java program without examining if it still holds.

    You will, however, find that keeping your program simple and above all - readable - will make it much easier to maintain both for you and for future programmers. Any unneccessary complexity will baffle your future readers, and you will need to say in a comment why it MUST be like that (otherwise they will just refactor it back into its original form :)

    0 讨论(0)
  • 2021-01-05 00:51

    Don't second guess a modern java compiler unless you know exactly what you are doing. This not only applies to simple math like you question, but everything. E.g.: like flow control.

    People waaaaay smarter than us have put lots of effort into making it all super fast.

    0 讨论(0)
提交回复
热议问题