对于ELKI,我需要(并且已经有了)比Java JDK和Collections API提供的更灵活的排序实现。(排序不是我的终极目标。我使用部分排序来进行索引结构的批量加载,例如k-d树和R * -tree,并且我想使这些结构的相当通用的实现可用,比当前在ELKI中的更通用-但无论如何,优化排序意味着优化索引构建时间)。
然而,排序算法的规模因您的数据大小而异。对于微小的数组,众所周知插入排序可以表现良好(事实上,大多数快速排序实现将在某个阈值以下回退到插入排序);这不是通过理论,而是通过CPU流水线和代码大小效应,这些效应在排序理论中没有考虑。
因此,我目前正在基准测试一些排序实现,以找到最适合我的特定需求的最佳组合;我希望我的更灵活的实现与JDK默认实现有些相似(它们已经调整得很好,但可能适用于不同的JDK版本)。
从长远来看,我需要这些东西易于复制和重新运行。在某个时候,我们将看到JDK8。在Dalvik VM上,结果可能与Java 7上的结果也不同。甚至在AMD、Core i7和Atom CPU上也可能不同。因此,也许Cervidae将包括不同的排序策略,并在类加载时间上选择最合适的策略。
我的当前工作在GitHub上: https://github.com/kno10/cervidae 现在是实际问题。最新的caliper提交添加了一些用于宏基准测试的实验代码。然而,我面临的问题是我需要两者都有。当运行时间小于计时器分辨率的0.1%时,Caliper宏基准测试失败;对于10000个对象,一些算法达到了此阈值。同时,微基准测试抱怨说当运行时间过长时,你应该做一个宏基准测试...
哪一个“适配器”更好?有没有其他提示可以使微观到宏观的基准测试更加一致?
考虑到caliper WebUI目前不可用,你使用什么来分析结果?我目前正在使用一个小型python脚本来处理JSON结果并报告加权平均值。事实上,我更喜欢旧的文本报告而不是Web UI。
哦,是否有办法让Caliper在基准测试循环中发生Hotspot编译时重新运行基准测试?现在它会记录一个错误,但也许它可以重新启动基准测试的那部分?
然而,排序算法的规模因您的数据大小而异。对于微小的数组,众所周知插入排序可以表现良好(事实上,大多数快速排序实现将在某个阈值以下回退到插入排序);这不是通过理论,而是通过CPU流水线和代码大小效应,这些效应在排序理论中没有考虑。
因此,我目前正在基准测试一些排序实现,以找到最适合我的特定需求的最佳组合;我希望我的更灵活的实现与JDK默认实现有些相似(它们已经调整得很好,但可能适用于不同的JDK版本)。
从长远来看,我需要这些东西易于复制和重新运行。在某个时候,我们将看到JDK8。在Dalvik VM上,结果可能与Java 7上的结果也不同。甚至在AMD、Core i7和Atom CPU上也可能不同。因此,也许Cervidae将包括不同的排序策略,并在类加载时间上选择最合适的策略。
我的当前工作在GitHub上: https://github.com/kno10/cervidae 现在是实际问题。最新的caliper提交添加了一些用于宏基准测试的实验代码。然而,我面临的问题是我需要两者都有。当运行时间小于计时器分辨率的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在基准测试循环中发生Hotspot编译时重新运行基准测试?现在它会记录一个错误,但也许它可以重新启动基准测试的那部分?