whos2002110 浙江传合网络科技有限公司 软件工程师  2014年09月10日
加精
高分求教
系统里面有个计算需要借助matlab程序实现。 但使用过程中发现频繁调用matlab导致调用越来越慢。

下面是一个简单的测试例子,计算两个数四则运算结果, 测试引入了matlab工具生成的myCal.jar及matlab java编程所需的工具包。 MyCal对象提供了matlab函数的主调用方法myCal, MyCal构造较慢未计入耗时统计。

代码里循环调用myCal方法, 每1w次打印出这1w次调用所消耗的时间,结果显示越往后耗时越久。 执行过程中通过jconsole查看jvm内存及垃圾回收并无异常。

这是我看到的一段关于jni调用的说法:

“使用本机代码编写应用程序的一部分,特别是频繁使用的部分,并将之与 Java 链接,这样做通常是为了提高性能。不过,JVM 与本机代码之间的通信通常很慢,因此,太多的 JNI 调用可能会降低性能。只要有可能就应该将本机操作集合在一起,以减少 JNI 调用的数量”

测试代码:


import com.mathworks.toolbox.javabuilder.MWException;

import myCal.MyCal;

public class CalTest {

static MyCal myCal;
static {
try {
myCal = new MyCal();//matlab计算对象
} catch (MWException e) {
e.printStackTrace();
}
}

static void cal() throws MWException {
long t0 = System.currentTimeMillis();
for (int i = 1; i <= 30000; i++) {
//调用matlab函数计算结果(jni调用)
Object[] calResult = myCal.myCal(4, 2, 3);

if ((i % 10000) == 0) {
long t1 = System.currentTimeMillis();
//每1w次打印执行时间, 发现调用越多则调用越慢
System.out.println("第" + (i / 10000) + "w用时:" + (t1 - t0) / 1000);
t0 = t1;
}
}
}

public static void main(String[] args) throws Exception {
cal();
Thread.sleep(30000);
System.out.println("=====");
cal();
}
}


有没有相关经验给分析呀,如何解决这个问题, 感激不尽
...全文
1923 点赞 收藏 33
写回复
33 条回复

还没有回复,快来抢沙发~

发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告