3

问题背后的原因

对于物理项目,我们想要分析两个曲面(由一堆顶点指定)并计算这些曲面之间的体积。为了能够做到这一点,我们想要实现一个二维区间搜索树。总的渐近运行时间将接近 O(n 2 log n)。

问题

总之,我们将实现一个算法,这将非常耗时。此外,该算法并没有从 matlab 中高度优化的数学库中受益。因此,我们正在考虑从matlab中调用Java。最后,我们想知道:

“忽略 matlab 中数学库的高度优化性能,Java 比 matlab 快到什么程度?”

“从matlab重复调用java方法时是否有任何明显的延迟?”

例如,每次调用该方法时都必须启动 JVM 吗?每次调用该方法时都必须加载 jar 吗?

我希望你们中的一些人可以帮助我(也许还有其他人)这个问题。

4

4 回答 4

2

我之前曾多次在 MATLAB 命令行中使用 Java 类。我不知道每次进行 Java 调用时是否会重新启动 JVM,我也没有测量与执行独立 Java 类相比延迟有多少。但是,我根本没有“感觉到”任何缓慢。

您似乎需要为您的问题创建自定义数据结构,这是您无法使用 MATLAB 轻松或有效地完成的事情。另一个有助于决定使用哪个的问题是:使用 Java 还是使用 Matlab 开发会更快吗?如果这个问题的答案是 Java,我肯定会建议使用 Java。

于 2012-05-27T07:47:53.490 回答
1

如果您决定在 MATLAB 中编写实现,这里有一些非常好的观点@AndrewJanke在 MATLAB 中的 OOP 性能的一个很好的答案中提出(值得阅读整篇文章):

在 MATLAB 中模仿 C++ 或 Java 类可能不是最优的。Java/C++ 类的构建通常使对象成为最小的构建块,尽可能具体(即,许多不同的类),并且将它们组合成数组、集合对象等,并使用循环对其进行迭代。要制作快速的 MATLAB 类,请彻底改变这种方法。拥有更大的类,其字段是数组,并在这些数组上调用矢量化方法。

重点是安排您的代码以发挥语言的优势——数组处理、矢量化数学——并避免弱点。

为了回答您的问题,我引用了文档:

在 MATLAB 启动时,部分 MATLAB 虚拟地址空间由 Java 虚拟机 (JVM) 保留,不能用于存储 MATLAB 数组。

所以它只在启动时初始化一次。

在调用 Java 方法而不是 M 文件时也会产生开销(因为 MATLAB 类型必须与 Java 数据类型进行编组)。

现在,如果您想挤出最后一点性能,请确保将 Java 方法调用为:

func(obj)

代替:

obj.func()
于 2012-05-27T22:46:22.950 回答
1

这个问题似乎非常适合并行性。为什么 Java 是您首先考虑的唯一替代方案?我认为您应该了解初始代码的性能如何,并在必要时考虑使用 MATLAB 的一些内置 GPU 功能。

于 2012-05-27T19:59:14.540 回答
0

我建议您尝试以您认为最简单的方式实现原型,并看看它的性能如何。如果性能明显不够好,请尝试替代方法,看看是否更好。

(很难对这样的事情做出一般性预测,因为真正的答案通常严重依赖于问题的细节和您的设计。另一方面,您可能会发现您没有获得足够的加速据称更有效的方法来证明努力的合理性。)

于 2012-05-27T07:48:10.797 回答