首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二元搜索不匹配理论分析的实证分析

二元搜索不匹配理论分析的实证分析
EN

Stack Overflow用户
提问于 2013-08-13 19:35:02
回答 2查看 211关注 0票数 1

我目前正在测试二进制搜索的一般情况。简单地说,我所做的就是生成一个随机变量,然后使用二进制搜索在不同大小的数组中搜索这个随机变量。下面是我使用的代码:

代码语言:javascript
复制
   public static void main(String[] args) 
    {
        //This array keeps track of the times of the linear search
        long[] ArrayTimeTaken = new long[18];

        //Values of the array lengths that we test for
        int[] ArrayAssignValues = new int[18];
        ArrayAssignValues[0] = 1000000;
        ArrayAssignValues[1] = 10000000;
        ArrayAssignValues[2] = 20000000;
        ArrayAssignValues[3] = 30000000;
        ArrayAssignValues[4] = 40000000;
        ArrayAssignValues[5] = 50000000;
        ArrayAssignValues[6] = 60000000;
        ArrayAssignValues[7] = 70000000;
        ArrayAssignValues[8] = 80000000;
        ArrayAssignValues[9] = 90000000;
        ArrayAssignValues[10] = 100000000;
        ArrayAssignValues[11] = 110000000;
        ArrayAssignValues[12] = 120000000;
        ArrayAssignValues[13] = 130000000;
        ArrayAssignValues[14] = 140000000;
        ArrayAssignValues[15] = 150000000;
        ArrayAssignValues[16] = 160000000;
        ArrayAssignValues[17] = 170000000;

        //Code that runs the linear search
        for (int i = 0; i < ArrayAssignValues.length; i++) 
        {
            float[] arrayExperimentTest = new float[ ArrayAssignValues[i]];

            //We fill the array with ascending numbers 
            for (int j = 0; j < arrayExperimentTest.length; j++) 
            {
                arrayExperimentTest[j] = j;
            }

            Random Generator = new Random();
            int ValuetoSearchfor = (int) Generator.nextInt(ArrayAssignValues[i]);
            System.out.println(ValuetoSearchfor);
            ValuetoSearchfor = (int) arrayExperimentTest[ValuetoSearchfor];

            //Here we perform a the Linear Search
            ArrayTimeTaken[i] = BinarySearch(arrayExperimentTest,ValuetoSearchfor);
        }
        ChartCreate(ArrayTimeTaken);  
        System.out.println("Done");
    }

以下是二进制搜索的代码:

代码语言:javascript
复制
 static long BinarySearch(float[] ArraySearch,int ValueFind)
    {
        System.gc();
        long startTime = System.nanoTime();

        int low = 0;
        int high = ArraySearch.length-1;
        int mid = Math.round((low+high)/2);

        while (ArraySearch[mid] != ValueFind ) 
        {            
            if (ValueFind <ArraySearch[mid]) 
            {
                high = mid-1;
            }
            else
            {
                low = mid+1;
            }
            mid = (low+high)/2;
        }
        long TimeTaken = System.nanoTime() - startTime;
        return TimeTaken;
    }

现在的问题是,结果没有意义。下面是一个图表:

有人能解释为什么第一个数组花费这么多时间吗?我已经运行了几次代码,它基本上是每次创建的相同的图形。Java有一些缓存结果吗?有人能解释一下为什么第一次二进制搜索比其他搜索要花费这么长的时间,即使数组的大小比其他的小吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-13 19:37:07

看起来你在一个接一个地进行这些搜索,从最低值开始。如果是这样的话,那么代码运行的速度会慢得多,因为JIT编译器还没有机会热身。通常,对于这样的基准测试,您希望在进行真正的测试之前,通过所有相关代码来给JIT编译器编译和优化的时间。

有关JIT编译器的更多信息,请阅读

您还应该看到这个问题来了解更多关于基准测试的知识。

速度慢的另一个可能原因是JVM可能仍在启动过程中,并且在计时时运行它自己的后台代码,从而导致减速。

票数 2
EN

Stack Overflow用户

发布于 2013-08-13 19:40:32

基准不是这样做的,你应该运行至少1000个周期作为一个“热身”,然后才开始测量。基准测试可能比看起来要复杂得多,应该仔细构建它,以免受到内存中同时运行的其他程序的影响。https://stackoverflow.com/questions/8423789/benchmarking-inside-java-codehttps://stackoverflow.com/questions/4583175/benchmarking-java-programs可以找到一些很好的提示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18217672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档