是否有任何基准可用于比较 Java Unsafe 与 Java 与 C 区域中的堆外内存的内存访问?例如,Java LZ4(或 L4Z?)压缩库表示,他们使用 Unsafe 的 Java 移植速度是原生 C 实现速度的 66%。
问:有什么可以给我一个(更好的)估计吗?
我想知道如果某个库存在不安全问题,是否值得采用 C 解决方案以及我应该移植哪些部分。使用堆外内存或带有大型数组(兆字节)的堆内存可能不会节省很多。唯一值得一提的是,使用 unsafe 我可以通过读取任意偏移处的整数而不是字节等来使用我想要的任何粒度。这将极大地改进我试图加速的一个问题的算法。
最佳答案
是的。唯一能让您更好地估计的是试验,类似于作者运行的试验,但在您打算使用的系统和程序上进行,而不是在作者打算用来测试的系统和程序上进行。
我认为“声称他们使用 Unsafe 的 Java 移植速度是 native C 实现速度的 66%”的作者有意使用任何可能的手段来销售他的产品。
考虑一下,目前不存在“ native C 实现”,也不可能存在,因为 C 被设计为可移植的。唯一“ native ”的是机器代码,甚至这有时也会引发一些争论。有好的 C 编译器和坏的 C 编译器。这两种品质都形成了“ native ”机器代码。测试中使用的是哪一款?
一旦将 C 或 Java 翻译为机器代码或 JVM 字节码,它就不再是 C 或 Java。它是机器代码或 JVM 字节码。这引出了我的下一点,我将以问题的形式来表达:如果执行相同任务的 C 程序和 Java 程序都编译为相同的 JVM 字节码,则哪个程序更快吗?
除非我们将速度归因于指令、缓存未命中以及所有这些,否则我们无法测量速度。虽然他们的代码可能是“原生 C 实现速度的 66%”(无论这意味着什么),但他们可能会针对自己的机器进行一些非常倾斜的优化,以获得这些数字。
总而言之,只有当您打算在作者的计算机上运行这些测试时,作者执行的测试才是现实的,而该计算机不一定是您自己计算机上的软件。
关于Java 不安全内存操作 vs. Java vs. C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29447612/