1
19
不是一个完整的答案,我只是没有时间做你的问题需要的详细基准,但希望有用。 了解你的敌人
如果您的目标市场/应用程序将主要运行在特定的体系结构上,那么您应该考虑投资特定于它的工具。 *如果您在x86上的性能是关键因素,那么intel的 VTune 非常适合深入研究 jit output analysis enregistering 机会是非常不同的。 获得正确的工具
您可能需要一个采样分析器。对于您的特定需求,插装的开销(以及相关的连锁反应,如内联、缓存污染和代码大小膨胀)太大了。“英特尔VTune分析器”实际上可以用于Java,尽管集成没有其他分析器那么紧密。
从其他实现中学习The Change history 更改历史记录表明,以前的内联程序集实际上适得其反,并且允许编译器完全控制输出(在 而不是汇编中的指令)产生了更好的结果。 一些细节
需要避免使用转义分析无法捕获的对象分配(仅在1.6以后的版本中)。 c code 积极使用循环展开。然而,在较旧(1.4纪元)的虚拟机上的性能是 heavily dependant on the mode the JVM is in . 显然,后面的sun jvm版本在内联和展开方面更具攻击性,特别是在服务器模式下。
你的目标正在移动,并将继续移动。再次重申马克·莱曼以前的经历: 即使是对jvm的微小更新也可能涉及 significant compiler changes
显然是队长量,量,量。如果你能让你的库包含(在一个单独的dll中)一个简单且易于执行的基准,记录相关信息(vm版本、cpu、操作系统、命令行开关等),并将其简单地发送回你,你将增加你的覆盖范围,最重要的是你将覆盖那些使用它的人。 |
2
6
远至 就这点而言,我相信新的JDK已经包含了一个改进的算法,只要有可能就可以消除它。以下是关于这一主题的两篇主要论文:
this 这篇博文对其中一篇论文进行了肤浅的讨论,并给出了一些基准测试结果,不仅针对新JDK中的数组,还针对算法。博客的评论也很有趣,因为上述论文的作者提出了一些非常有趣的评论和讨论论点。此外,还有一些关于这一主题的类似博客文章。 希望能有帮助。 |
3
3
在优化像LZW这样简单的数字运算算法方面,您不太可能需要帮助JIT编译器。ShuggyCoUk提到了这一点,但我认为值得特别注意:
您必须尽可能减少工作集的大小并改进数据访问位置。您提到“将字节打包成整数以提高性能”。这听起来像是使用int来保存字节值,以便将它们与单词对齐。不要那样做!增加的数据集大小将超过任何收益(我曾经将一些ECC数字处理代码从int[]转换为byte[],并获得2倍的速度提升)。
很可能您不知道这一点:如果您需要将某些数据同时作为字节和整数处理,则不必移位和|-屏蔽-使用
最好自己做基准测试。当我在Java1.3时代这么做的时候,大约有2000个元素。 |
4
2
到目前为止,有很多答案,但还有几个问题:
H2实现也进行了相当多的优化(例如:不再清除哈希数组,这通常是有意义的);实际上,我帮助修改了它,以便在另一个Java项目中使用。我的贡献主要是改变它,使其在非流的情况下更加优化,但这并没有触及紧密的编码/解码循环。 |