背景
实验用 Java3d 做树木建模,其中一个重要过程是从三维点云中提取出树木骨架,这里的骨架提取算法包括且不限于八叉树降采样、k近邻提取邻居图、Dijkstra计算最短路径、提取图联通分量、k-means 聚类、目标函数最优化、三次曲线插值等过程。
用一套算法组成的 pipeline 来实现骨架提取,时间开销还是一个比较重要的评估因素的。
所以要做 Profile,一个土办法是,在几个关键方法入口和出口记录时间戳,两个时间戳一减得到这个方法的时间开销。一开始我就是这么干的:
换更高效的工具
还是换个更高效的工具吧,我发现 IntelliJ IDEA 居然默认不提供 Profiler,去搜索了一下,有人提到 VisualVM,于是下载了这个插件。后来发现这个插件本身不是 Profiler,我得去官网下载这个工具。
用法
其实,压根不需要下载 IntelliJ IDEA 的 VisualVM 插件,没什么卵用。直接下载 visualvm_141.zip,打开 ./bin/visualvm.exe。
- 打开后显示出了当前 JRE 下面所有在跑的 Java 应用。
- 运行要 Profile 的 Java 应用。
- 打开 Profiler 页面,先点 CPU,再点 Stop,两次点击之间就在做 Profile 了。下面的结果就出来了。
但是还是要注意一下,右边的红框框里面的类才会被 Profile。
另外就是,启动 Java 应用后,Java 应用不会留给我时间去点那个 CPU 按钮,所以我干脆在 main() 函数的第一行加了一句
new Scanner(System.in).nextLine();
这样我点击了 CPU 按钮后,再去命令行敲一下回车,程序再跑起来。这种方法也是很土的,不过还挺好用。