Java 二进制搜索运行时中的某些异常

Java 二进制搜索运行时中的某些异常,java,algorithm,big-o,analysis,binary-search,Java,Algorithm,Big O,Analysis,Binary Search,我有一个二进制搜索的修改版本,它以排序顺序接收数组和一个值,并返回元素的最小可能索引,该索引等于或大于给定值(如果值大于最大值,则返回-1) 在运行上述算法后,一切正常,方法也按预期工作。但是,我在不同的输入大小上运行它来测量运行时 for(int i=1;i<=20;i++){ int size=10*(i*i*i*i); int[] array=createRandomSortedArray(size); long startTime=System.nanoTime(

我有一个二进制搜索的修改版本,它以排序顺序接收数组和一个值,并返回元素的最小可能索引,该索引等于或大于给定值(如果值大于最大值,则返回-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");
}
我看到10个输入的执行时间明显高于其连续160个输入大小。 为了验证这一点,我在循环外单独运行了10个输入,结果如下

To find 50 in 10 inputs  execution time is 962 nanoseconds

为什么会这样?为什么会存在这种异常?还有两个其他步骤,其中运行时比之前的较低输入大小慢。

可能是热点发挥其神奇作用的地方。颠倒运行顺序(先大后小)以验证这一点。

要分析这一点,我将输出算法正在搜索的实际数组。由于每次运行的阵列看起来不一样,因此很难进行比较,因为访问的标识数量完全取决于阵列和搜索项目的内容。

在运行微基准之前,您是否让虚拟机“预热”?在实际记录任何结果之前,请尝试运行此代码数千次,看看这是否会产生影响。您可以添加以下命令行参数以查看JIT编译的内容:

-XX:+PrintCompilation
您还可以使用运行程序

-Xint
关闭所有热点优化,并尝试进行苹果对苹果的比较

如果这不是问题所在——我怀疑简单地调用您的方法会带来一些固定成本。试着线性增加输入大小,看看你是否可以这样画出任何关联。很难说你从10跳到160

最后,您可能希望包含一个标志,启用该标志后,将记录代码执行的行为(例如,比较等),以查看您是否执行了任何不必要的工作

-Xint