是这样的,我们这个项目,增加了 MATLAB Runtime 相关的东西。
项目调用 MATLAB 导出的 jar 包的时候,会调用 MATLAB Runtime c 之类的本地化的东西。导致项目巨慢。
所以想问问有没有 工具 或 办法 能查一下哪个地方调用慢?
有经验的朋友指点下?
我目前感觉的是实例化 jar 包中对象 的时候执行的比较慢,感觉把它构造成一个 Spring Bean 能快一点,还没实验。对象构造的源码还没看呢。。。
1
luosuosile 2018-07-27 16:12:37 +08:00 1
我来给楼主暖贴。是接口慢吗?不能查看调用日志来分析吗?实例化对象很慢,那对象应该很大?或者实例化的时候有大量循环?,如果没这种事情,实例化对象应该不会慢啊。
|
2
Eugene1024 2018-07-27 16:20:16 +08:00
日志 打印程序执行的时间戳
|
3
zhaogaz OP @luosuosile 是这样的,我要调用 MATLAB 生成的 jar 包 的话,需要在机器上装一 MATLAB Runtime 无论系统是 linux 还是 windows。大小大约是 1 个多 G 吧。
装完了之后 这个 jar 包才能正常使用。——》也就意味着,相当于 java 调用 c++ 。 跟你说的接口不太一样。 java 这边没啥,就是 一句 new,大不大不知道,循环也不知道,都是 matlab 提供的。人家的 jar 我也没办法改。 日志是个好办法,我仔细看看。有没有用的上的。debug 输出的东西挺多的,一直没仔细看。 |
4
luosuosile 2018-07-27 16:55:10 +08:00
@zhaogaz 也有可能是需要实例化的对象太多占满了内存?导致虚拟机需要多次 Full GC,java 调用 c++的话,应该是 c++那边算好了,再把结果返回给 java,这个过程 emm,是不是相当于要经过这样的过程呢从外部设备 io-》 java 虚拟机直接内存-》 java 堆。
如果是的话, 假如存在大量的这样的过程,相比会耗费比平常要多的时间。 我也是信口胡诌的,我没做过,希望能给我解下疑惑呢,感谢。 |
5
Mithril 2018-07-27 18:36:27 +08:00
JNI 调用的话,内存占得多很正常。传一个数组过去它会复制出好几份来。
你可以直接用 C++调用 Matlab,然后把对象用过 protobuf 一类的东西塞回 JVM,顺便还能做个异步。 不过最好的办法就是不用 Matlab。一般都是用它做了算法以后找人实现出来,实现的时候就会脱离 matlab 了。 |
6
zhaogaz OP @Mithril 哎,其实我也是这么想的,调用 matlab 本身就是几个统计函数。java 写的话就是稍微花点时间。
上司不同意,说这么用做得快(上司是一名百度回答选手) 估计以后也不会改了。垃圾公司,过一阵子跳槽好了。。。 |
7
zhaogaz OP |
8
Mithril 2018-07-27 18:59:14 +08:00
@zhaogaz 随便找个统计库就好了啊,不过老板不同意就没办法了。一个产品做成什么样主要还是看老板的品味,上司 low 的话刷点经验等着跑路就好了。
|
9
wdlth 2018-07-27 21:29:36 +08:00
不能用 RPC 中转一下么?每次都要启动 Matlab ?
|
11
codingKingKong 2018-07-28 10:24:14 +08:00
@zhaogaz 没有用过 MATLAB 啊, 如果是做单例的话, 小心构造里会不会有每次实例化不同的变量存在就好~
|