Java 不安全内存操作 vs. Java vs. C

标签 java c memory unsafe

是否有任何基准可用于比较 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/

相关文章:

c - DLL 注入(inject)器不工作(64 位编译器)

c - 为什么 OpenMP 禁止在 "#pragma omp parallel"中使用 lastprivate?

objective-c - ARC 的内存泄漏

java - 类的通用类型

web-services - 通过 http 连接到远程数据库的富客户端(swing)应用程序

java - 如何使用hibernate在sql查询 "date like :today "中的where条件中使用setParameter作为日期字段

java - 计算lucene搜索的时间

c - 段错误(核心已转储),但找不到故障

java - Java 中一个类的多个静态实例?

caching - 如何知道特定 ColdFusion 变量或 ColdFusion 作用域的每个属性正在使用多少内存?