【发布时间】:2010-12-06 10:26:14
【问题描述】:
我们的主程序是用 java 编写的,但是从存储中提取数据的代码是用 C 编写的。我需要从提取的数据中构建一个 HDF5 文件。使用JNI调用C代码获取数据然后从Java构建HDF5文件还是从C代码构建HDF5更好?
我对 JNI 或 C 的经验很少。
此外,我们的主要标准之一是性能。使用 JNI 对性能有多大影响?
【问题讨论】:
标签: java-native-interface hdf5
我们的主程序是用 java 编写的,但是从存储中提取数据的代码是用 C 编写的。我需要从提取的数据中构建一个 HDF5 文件。使用JNI调用C代码获取数据然后从Java构建HDF5文件还是从C代码构建HDF5更好?
我对 JNI 或 C 的经验很少。
此外,我们的主要标准之一是性能。使用 JNI 对性能有多大影响?
【问题讨论】:
标签: java-native-interface hdf5
在我看来,由于您对 C 的经验很少,因此您最好的选择是从 Java 中开始。JNI 确实没有那么糟糕。
【讨论】:
函数调用边界很“慢”,因此如果您对本机例程进行多次调用,那么性能会受到影响。
可能从迁移到 JNI 中受益的一个例子(我强调 可能,因为 Java 对于许多用途来说已经足够快了)将是例程对大型位图进行某种图像处理。但是为每个 pixel 调用一个 JNI 例程会比在纯 Java 中的循环中执行它要慢得多。
坦率地说,将数据从一种格式提取到另一种格式是最好用 Python 等“脚本”语言完成的事情,并且永远不会受到 CPU 的约束。相反,磁盘速度会比任何语言解释器都慢。
【讨论】:
我对C以外的HDF接口完全不熟悉,所以我无法和你比较。
我要指出的是,这是所有其他接口都使用的 API,因此,如果您发现需要寻求最大性能,那么 C API 将是最好的。
还有一个关于 API 的哪些部分可供您使用的问题。例如,我最初是从 C++ 接口开始的。一些 API 仍然只能在 C API 中使用。当您使用 C 和 C++ 时,这不是问题,但如果您需要的 API 不可用,则可能会出现问题。
话虽如此,您确实需要根据 C 的对象模型来搞清楚:例如。指针、句柄等的使用。
【讨论】: