我有一个二进制搜索的修改版本,它以排序顺序和一个值接收一个数组,并返回一个等于或大于给定值的元素的最小可能索引(如果值为,则返回-1)大于最大值)
运行上述算法后,一切正常,方法按预期工作。但是,我在不同的输入大小上运行它来测量运行时。
for(int i=1;i<=20;i++){
int size=10*(i*i*i*i);
int[] array=createRandomSortedArray(size);
long startTime=System.nanoTime();
int index=findSmallestIndex(array, needle);
long et=System.nanoTime()-startTime;
System.out.println("To find "+needle+" in "+size+" inputs "+" execution time is "+et+" nanoseconds");
}
以下是观察: -
To find 50 in 10 inputs execution time is 5775 nanoseconds
To find 50 in 160 inputs execution time is 1925 nanoseconds
To find 50 in 810 inputs execution time is 4330 nanoseconds
To find 50 in 2560 inputs execution time is 5293 nanoseconds
To find 50 in 6250 inputs execution time is 3849 nanoseconds
To find 50 in 12960 inputs execution time is 3368 nanoseconds
To find 50 in 24010 inputs execution time is 3849 nanoseconds
To find 50 in 40960 inputs execution time is 11548 nanoseconds
To find 50 in 65610 inputs execution time is 9143 nanoseconds
To find 50 in 100000 inputs execution time is 4812 nanoseconds
To find 50 in 146410 inputs execution time is 4812 nanoseconds
To find 50 in 207360 inputs execution time is 11549 nanoseconds
To find 50 in 285610 inputs execution time is 8661 nanoseconds
To find 50 in 384160 inputs execution time is 8661 nanoseconds
To find 50 in 506250 inputs execution time is 11549 nanoseconds
To find 50 in 655360 inputs execution time is 11067 nanoseconds
To find 50 in 835210 inputs execution time is 11549 nanoseconds
To find 50 in 1049760 inputs execution time is 11549 nanoseconds
To find 50 in 1303210 inputs execution time is 11067 nanoseconds
To find 50 in 1600000 inputs execution time is 12030 nanoseconds
我看到10个输入的执行时间明显高于其连续的160个输入大小。 为了验证这些事情,我在循环外部执行了10个输入的执行,后面是结果
To find 50 in 10 inputs execution time is 962 nanoseconds
为什么会这样?为什么这种异常存在?还有其他几个步骤,其中运行时间比其先前较低的输入大小慢。
答案 0 :(得分:2)
在运行微基准测试之前,您是否让VM'热身'?在实际记录任何结果之前尝试运行此代码几千次,看看是否有所作为。您可以添加以下命令行参数以查看JIT编译的内容:
-XX:+PrintCompilation
您也可以使用
运行程序-Xint
关闭所有Hotspot优化并尝试获取苹果进行比较。
如果这不是问题 - 我怀疑简单地调用你的方法会有一些不变的成本。尝试线性增加输入大小,看看是否可以通过这种方式绘制任何相关性。当你从10跳到160时很难分辨。
最后,您可能希望包含一个标志,该标志在启用时将记录代码执行的行为(例如,比较等),以查看您是否正在执行任何不必要的工作。
答案 1 :(得分:1)
可能是Hotspot正在发挥其魔力。颠倒运行的顺序(大的第一个)来验证。
答案 2 :(得分:0)
要分析这个,我会输出算法搜索的实际数组。由于看起来每次运行的数组不一样,因此很难比较,因为访问的指标数完全取决于数组和搜索项的内容。