为了看看我是否真的可以通过使用 JNI(而不是编写完整的 Java 应用程序)从本机代码(编写的 C)中获益,我想测量通过 JNI 调用的开销。衡量这种开销的最佳方法是什么?
3 回答
我不会使用分析器进行定量性能测试。分析倾向于将失真引入实际时序数。
我将创建一个基准来执行您正在考虑在 C 中进行的实际计算之一,并将 C + JNI + Java 版本与纯 Java 版本进行比较。确保您在比较苹果和苹果;即在对它们进行基准测试之前分析和优化这两个版本。
为了进行实际的基准测试,我会构建一个循环来执行大量计算,记录大量迭代的时间并进行比较。确保考虑到 JVM 预热效应;例如类加载、JIT 编译和堆预热。
像 Thihara 一样,我怀疑使用 C + JNI 会有多大帮助。即使是这样,您也需要考虑 JNI 的缺点;例如,C 代码可移植性、特定于平台的构建问题……如果您的本机代码有错误,则可能出现 JVM 硬崩溃。
单独测量开销可能会给您带来奇怪的结果。我会用 Java 和 C++ 编写一小部分对性能至关重要的代码并测量程序性能,例如,使用 caliper(微基准测试是一件相当复杂的事情,几乎没有人能做对)。
我不会使用任何分析器,尤其是 C++ 分析器,因为仅 C++ 部分的性能并不重要,而且分析器可能会扭曲结果。
使用 C++ 分析器和 Java 分析器。它们在 Java 的 IDE 中可用。我只能假设在 C++ 的情况下。无论您设计什么测试,请运行大量循环以尽量减少环境错误。
哦,把结果发回来,因为我也很想知道在现代 JVM 上使用本机代码是否有任何改进。虽然您可能不会在本机代码中看到巨大的性能改进。