通过JNI实现Java或C ++中的Matrix操作?

时间:2017-09-12 13:52:51

标签: java c++ java-native-interface

我基本上试图在java中为电路解算器完成MNA(修改节点分析)。它们基本上涉及解决大量的线性方程,因此我最终得到了矩阵代数。 MTJ和其他几个Java库都很棒,但是我的任务是自己实现它,并且在Java中也是如此,因为我的整个项目都是用Java编写的。我想知道我是否应该继续使用Java实现,或者是否可以通过JNI在C ++中使用它来提供更好的性能以保证其实现?我只是担心JNI在传递一万或更高级别的矩阵时会产生的瓶颈,或者这不是一个问题吗?

2 个答案:

答案 0 :(得分:1)

我向您提出的最强烈建议是,在开发代码时不要尝试优化代码以提高性能。几乎不可能提前知道代码需要优化的内容。通常,您最终会得到可读性较差,可维护性较差的代码。

  1. 使用Java开发您的库,旨在最大限度地提高清晰度和正确性。忽略表现。

  2. 针对实际负载的基准性能。例如,如果您需要处理数百万个矩阵,那么请测试需要多长时间。

  3. 确定您是否遇到问题。现代硬件与JRE的所有性能元素相结合意味着在这个阶段需要完成任何事情的情况要少得多。如果需要做某些事情,可以考虑在更强大的机器上运行,而不是优化代码。这通常是一个更便宜的选择。

  4. 如果您需要优化代码,请使用分析器查找瓶颈。通常,只有少数几个小区域消耗大部分资源。您可以浪费大量时间来优化影响非常小的代码。

  5. 优化这些瓶颈中的代码。有很多好的资源可以帮助你解决这个问题。定期重新运行基准以确保您有所作为。放松优化,结果没有任何区别。

答案 1 :(得分:0)

最快的矩阵操作将来自针对您的平台量身定制的优化BLAS和LAPACK。如果您需要速度,可以通过JNI链接到那些,但如果您需要速度,请不要尝试自己的矩阵包。熟悉各个硬件系统怪癖的人员对这些标准进行了大量优化。如果您不确定是否需要速度,请先使用Jama或其他一些基于Java的软件包。

另请注意,如果您进入BLAS / LAPACK,您可能会在底部获取Fortran代码,而不是C,C ++或Java。