Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡尺:微观和宏观基准_Java_Benchmarking_Caliper_Microbenchmark - Fatal编程技术网

Java 卡尺:微观和宏观基准

Java 卡尺:微观和宏观基准,java,benchmarking,caliper,microbenchmark,Java,Benchmarking,Caliper,Microbenchmark,例如,我需要(并且拥有)比标准JavaJDK和CollectionsAPI提供的更灵活的排序实现。(排序不是我的最终目标。我对批量加载索引结构(如k-d-树和R*-树)使用部分排序,我希望这些结构的实现相当通用,比ELKI中当前的实现更通用-但无论如何,优化排序意味着优化索引构建时间) 但是,排序算法的伸缩性因数据大小而异。对于微型阵列,插入排序可以很好地执行是众所周知的事实(事实上,大多数快速排序实现都会退回到低于某个阈值的插入排序);不是通过理论,而是通过CPU流水线和排序理论未考虑的代码大

例如,我需要(并且拥有)比标准JavaJDK和CollectionsAPI提供的更灵活的排序实现。(排序不是我的最终目标。我对批量加载索引结构(如k-d-树和R*-树)使用部分排序,我希望这些结构的实现相当通用,比ELKI中当前的实现更通用-但无论如何,优化排序意味着优化索引构建时间)

但是,排序算法的伸缩性因数据大小而异。对于微型阵列,插入排序可以很好地执行是众所周知的事实(事实上,大多数快速排序实现都会退回到低于某个阈值的插入排序);不是通过理论,而是通过CPU流水线和排序理论未考虑的代码大小影响

因此,我目前正在对一些排序实现进行基准测试,以找到满足我特定需求的最佳组合;我希望我的更灵活的实现与JDK默认实现(已经很好地调整了,但可能针对不同的JDK版本)有一定的关系。

从长远来看,我需要这些东西易于复制和重新运行。在某个时刻,我们将看到JDK8。在Dalvik虚拟机上,结果也可能不同于Java7。见鬼,他们甚至可能在AMD、Corei7和Atom CPU上也有所不同。 因此,也许鹿科动物会包含不同的分类策略,并根据类加载时间选择最合适的分类策略

我目前的工作是在GitHub上:

现在来谈谈实际问题。最新版本增加了一些宏基准测试的实验代码。然而,我面临的问题是,我两者都需要。当运行时间小于计时器分辨率的0.1%时,游标卡尺宏基准测试失败;对于10000个对象,一些算法达到了这个阈值。与此同时,微基准抱怨说,当你的跑步时间太长时,你应该做一个宏观基准

因此,对于不同排序大小的基准测试,我实际上需要一种根据运行时从微基准测试动态切换到宏基准测试的方法。 事实上,我甚至更希望卡钳能够自动意识到运行时对于一个宏基准来说足够大,然后只进行一次迭代

现在,我正试图通过以下方法来模拟这一点:

@Macrobenchmark
public int macroBenchmark() { ... }

public int timeMicroBenchmark(int reps) {
    int ret = 0;
    for (int i = 0; i < reps; i++) {
        ret += macroBenchmark();
    }
}
两个“适配器”中哪一个更可取?从微观到宏观,有没有其他关于获得一致基准的提示

鉴于卡尺WebUI当前不起作用,您使用什么来分析结果?我目前正在使用一个小型python脚本来处理JSON结果和报告加权平均值。事实上,我更喜欢旧的文本报告而不是web UI


哦,有没有一种方法可以让Caliper在基准测试循环中发生热点编译时重新运行基准测试?现在它记录了一个错误,但也许它可以重新启动这部分基准测试?

我认为问题在于microbenchmark仪器的输出被误解为“投诉”。它说:

信息:这个实验不需要一个微基准。计时器的粒度(小于%s)小于所测运行时间的0.1%。如果这个基准的所有实验的运行时间大于%s,请考虑MaCMROBIN标记仪器。
这条信息是专门用来传达一个单独的实验是冗长的,但由于该基准测试方法的其他实验可能并不冗长,这肯定不是一个错误。microbenchmark仪器的开销稍大一些,但虽然您的实验可能不需要microbenchmark,但结果仍然完全有效。

对您来说可能太晚了,但有一个新的(它是在几周前推出的)基准测试工具是openJDK的一部分:它应该解决卡钳遇到的一些问题。由Oracle的一些性能工程师创建。免责声明:我还没有试过,但似乎很有希望。谢谢。JMH看起来很有希望。也因为它似乎不像卡钳那样面向web UI。另外,它不会引入那么多依赖项。对于当前的许多Java项目,我最讨厌的一件事是到处都有大量的依赖链。卡钳也不例外,这取决于hibernate,例如,至少还有20个依赖项。也许我会试一试——越快越好。例如,我还没有开始将堆基准更新到caliper 1.0。这些还需要比排序更复杂的工作负载。RE:webui。今天正在推出与HEAD兼容的版本。:-)RE:热点编译。我想介绍这种行为,但是对于使用卡钳0.5的人来说,迁移路径和行为上的差异存在一些问题。临时解决办法只是让人们知道。现在正在跟踪一个bug@assylias FWIW,我们已经看到了该基准及其评论,出于各种原因,我们有点怀疑。Caliper使用的方法是许多长期Java库和平台开发人员的专业知识和建议的综合。这就是说,jmh有一些有趣的方面值得研究和进行一些比较分析,但遗憾的是,我不是安倍让它建立起来的。
@Macrobenchmark
public int macroBenchmark() {
    return timeMicroBenchmark(1);
}

public int timeMicroBenchmark(int reps) { ... }