Tag: bounds check elimination

我如何编码的Java允许使用SSE和边界检查消除(或其他高级优化)?

情况: 我正在优化LZF压缩algorithm的纯Java实现,它涉及到大量的byte []访问和基本的intmath,用于哈希和比较。 性能真的很重要,因为压缩的目标是减lessI / O需求。 我不张贴代码,因为它尚未清理,并可能会重组。 问题: 我怎样才能编写我的代码,以允许它使用更快的SSE操作JIT编译为表单? 我怎样才能构造它,使编译器可以轻松消除数组边界检查? 是否有关于特定math运算相对速度的广泛参考(需要多less增量/减量才能达到正常的加/减,移位速度有多快?还是与数组访问有多快? 我怎样才能优化分支 – 有更多的条件陈述短身体,或一些长期的,或短嵌套条件? 使用当前的1.6 JVM,在System.arraycopy击败复制循环之前必须复制多less个元素? 我已经做了什么: 在我受到过早优化攻击之前:基本algorithm已经非常优秀,但是Java的实现速度还不到C的速度的2/3。我已经用System.arraycopyreplace了复制循环,并且优化了循环,并且删除了un需要的操作。 我大量地使用bit来转换和填充字节来performance性能,以及转换和屏蔽。 出于法律方面的原因,我不能看类似库中的实现,而现有的库有太多限制的许可条款可供使用。 良好(接受)答案的要求: 不可接受的答案: “这是更快”没有解释多less和为什么,OR还没有用JIT编译器testing过。 边界线答案:在Hotspot 1.4之前没有经过任何testing 基本的答案:将提供一个通用的规则和解释,为什么它在编译器级别更快,并且大概快了多less 很好的答案:包括几个代码示例来演示 优秀的答案:有JRE 1.5和1.6的基准 完美的答案:是由HotSpot编译器工作的人员,可以完全解释或引用要使用的优化的条件,以及它通常的速度。 可能包括由HotSpot生成的Java代码和样例汇编代码。 另外:如果有人有详细的热点优化和分支性能的内涵的链接,欢迎。 我对字节码有足够的了解,即一个分析字节码而不是源代码级别的性能的站点会有所帮助。 (编辑)部分答案:Bounds-Check Ellimination: 这是从提供的链接到HotSpot内部维基: https : //wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination 在以下情况下,HotSpot将消除所有for循环中的边界检查: 数组是循环不变的(不在循环内重新分配) 索引variables有一个不断的步幅(按照常量增加/减less,如果可能的话,只有一个点) 数组由variables的线性函数索引。 例如: int val = array[index*2 + 5] OR: int val = array[index+9 […]