对于物理项目,我们想要分析两个表面(由一堆顶点指定)并计算这些表面之间的体积。为了能够做到这一点,我们想要实现一个二维区间搜索树。总的来说,渐近运行时间将接近于O(n 2 log n)。
总之,我们将实现一种算法,这将非常耗时。此外,该算法不会从matlab中高度优化的数学库中获益。因此,我们正在考虑从matlab调用Java。最后,我们想知道:
“Java在多大程度上比matlab更快,忽略了matlab中数学库的高度优化性能?”
和
“从matlab重复调用java方法时有没有明显的延迟?”
e.g。每次调用方法时都必须启动JVM吗?是否每次调用该方法都需要加载jar?
我希望你们中的一些人能够帮助我(或许是其他人)解决这个问题。
答案 0 :(得分:2)
之前我曾在MATLAB命令行中使用过几次Java类。我不知道每次进行Java调用时是否重新启动JVM,我也无法测量延迟与执行独立Java类相比的程度。但是,我并没有感觉到#34;任何缓慢。
您似乎需要为您的问题创建自定义数据结构,这是您无法轻松或有效地使用MATLAB做的事情。另一个有助于决定使用哪个问题的问题是:使用Java或使用Matlab进行开发会更快吗?如果答案是Java,我肯定会建议使用Java。
答案 1 :(得分:1)
这个问题似乎非常适合并行性。为什么Java是您首先考虑的唯一选择?我认为您应该看看初始代码的性能如何,如果有必要,请考虑使用MATLAB的一些内置GPU功能。
答案 2 :(得分: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()
答案 3 :(得分:0)
我建议您尝试以对您来说最简单的方式实现原型,并了解它的执行情况。如果表现显然不够好,请尝试其他方法,看看它是否更好。
(很难对这类事情做出一般性的预测,因为真正的答案往往关键取决于问题和设计的细节。另一方面,你可能会发现你没有得到足够的加速与所谓的更有效的方法来证明努力的合理性。)