繁体   English   中英

通过JNI在Java或C ++中实现矩阵运算?

[英]Implement Matrix operations in Java or in C++ through JNI?

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

我最强烈的建议是不要在开发代码时尝试优化代码的性能。 几乎不可能提前知道哪些代码需要优化。 通常,您最终会得到可读性差,可维护的代码,它们的性能不会更好。

  1. 以最大的清晰度和正确性为目的,用Java开发您的库。 忽略性能。

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

  3. 确定是否有问题。 现代硬件与JRE的所有性能元素相结合,意味着在此阶段需要执行任何操作的情况要少得多。 如果需要执行某些操作,请考虑在功能更强大的计算机上运行,​​而不是优化代码。 这通常是一个更便宜的选择。

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

  5. 优化这些瓶颈中的代码。 有大量的好资源可以帮助您。 定期重新运行基准测试,以确保您有所作为。 放松优化,结果没有任何区别。

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

还要注意,如果您使用BLAS / LAPACK,您可能会在底部获得Fortran代码,而不是C,C ++或Java。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM