【发布时间】:2013-03-27 21:01:49
【问题描述】:
对于ELKI,我需要(并且拥有)比标准 Java JDK 和 Collections API 提供的更灵活的排序实现。 (排序不是我的最终目标。我使用部分排序来批量加载索引结构,例如 kd-tree 和 R*-tree,并且我想为这些提供一个相当通用的实现,比目前 ELKI 中的更通用- 但无论哪种方式,优化排序都意味着优化索引构建时间)。
但是,排序算法的规模因数据大小而异。对于微小的数组,插入排序可以很好地执行是一个众所周知的事实(事实上,大多数快速排序实现会退回到低于某个阈值的插入排序);不是理论,而是排序理论未考虑的 CPU 流水线和代码大小影响。
因此,我目前正在对许多排序实现进行基准测试,以找到满足我特定需求的最佳组合;我希望我更灵活的实现在某种程度上与 JDK 默认实现(已经微调,但可能针对不同的 JDK 版本)保持一致。
从长远来看,我需要这些东西易于重现和重新运行。在某个时候,我们会看到 JDK8。在 Dalvik VM 上,结果也可能与 Java 7 不同。哎呀,它们甚至在 AMD、Core i7 和 Atom CPU 上也可能不同。 所以也许 Cervidae 会包含不同的排序策略,并在类加载时间上选择最合适的一种。
我目前的工作在 GitHub 上:https://github.com/kno10/cervidae
现在回到实际问题。最新的 caliper 提交为宏基准添加了一些实验性代码。但是,我面临的问题是我需要both。当运行时间小于定时器分辨率的 0.1% 时,Caliper 宏基准测试失败;对于 10000 个对象,一些算法达到了这个阈值。同时,微基准测试抱怨说,当你的运行时间太长时,你应该做一个宏基准测试......
因此,为了对不同的排序大小进行基准测试,我实际上需要一种根据运行时动态从微基准测试切换到宏基准测试的方法。 事实上,我什至更喜欢 caliper 自动意识到运行时对于宏基准测试来说足够大,然后只进行一次迭代。
现在,我正在尝试使用以下方法来模拟:
@Macrobenchmark
public int macroBenchmark() { ... }
public int timeMicroBenchmark(int reps) {
int ret = 0;
for (int i = 0; i < reps; i++) {
ret += macroBenchmark();
}
}
在两种情况下共享基准测试代码。另一种代码是使用
@Macrobenchmark
public int macroBenchmark() {
return timeMicroBenchmark(1);
}
public int timeMicroBenchmark(int reps) { ... }
这两个“适配器”中哪一个更可取?从微观一直到宏观,获得一致的基准测试的任何其他提示?
鉴于 caliper WebUI 目前无法使用,您使用什么来分析结果?我目前正在使用一个小型 python 脚本来处理 JSON 结果并报告加权平均值。事实上,我更喜欢旧的文本报告而不是 Web UI。
哦,有没有办法让 Caliper 在基准测试循环中发生热点编译时重新运行基准测试?现在它记录了一个错误,但也许它可以重新启动基准测试的那一部分?
【问题讨论】:
-
对您来说可能为时已晚,但 openJDK 有一个新的(几周前推出的)基准测试工具部分:openjdk.java.net/projects/code-tools/jmh,它应该解决 caliper 遇到的一些问题。由 Oracle 的一些性能工程师创建。免责声明:我还没有尝试过,但看起来很有希望。
-
谢谢。 JMH 看起来很有希望。也因为它似乎不像 caliper 那样面向 web-UI。另外,它不会引入那么多依赖项。对于当前的许多 Java 项目,我真正讨厌的一件事是随处可见的大量依赖链。 Caliper 也不例外,例如取决于 hibernate,它至少会引入另外 20 个依赖项。也许我会试一试——越早越好。例如,我还没有开始将我的堆基准更新到 caliper 1.0。这些也需要比排序复杂得多的工作负载。
-
RE:网络用户界面。今天正在推送与 HEAD 兼容的版本。 :-)
-
RE:热点编译。我想介绍这种行为,但是对于使用 Caliper 0.5 的人的迁移路径和行为差异存在一些担忧。临时解决方案只是让人们知道。现在正在跟踪一个错误。 code.google.com/p/caliper/issues/detail?id=238
-
@assylias FWIW,我们已经看到了该基准及其评论,并且由于各种原因有点可疑。 Caliper 使用的方法是对许多长期 Java 库和平台开发人员的专业知识和建议的综合。也就是说,jmh 有一些有趣的方面值得研究并进行一些比较分析,但遗憾的是我无法构建它。
标签: java benchmarking caliper microbenchmark