繁体   English   中英

Java中的时序混乱

[英]Timing Confusion In Java

对于我从事的项目,我的任务是为两种不同的搜索算法计时搜索时间:二进制搜索和顺序搜索。 对于每种算法,我都应该记录排序输入和未排序输入的时间。 当我比较排序输入和未排序输入的顺序搜索的搜索时间时,遇到了一些奇怪的事情。 根据我最先排序的时间,搜索时间将明显大于第二个时间。 因此,如果我先对排序的顺序搜索,则比对未排序的顺序搜索要花费更长的时间。

这对我来说没有意义,是我困惑的根源。 由于要从输入中获取键,因此可以确保在数据输入中找到搜索到的键(通过顺序搜索)。

这是造成问题的代码。 在这种情况下,seqOnUnsorted的搜索时间将比seqOnSorted的搜索时间长得多,而不应这样。

public void sequentialSearchExperiment(){
    seqOnUnsorted = sequentialSearchSet(keys, unsortedArray);
    writeOutExperimentResults(seqOnUnsorted, seqOnUnsortedFilename, "Sequential Sort on Unsorted: ");

    seqOnSorted = sequentialSearchSet(keys, sortedArray);
    writeOutExperimentResults(seqOnSorted, seqOnSortedFilename, "Sequential Sort on Sorted: ");

}

sequenceSearchSet()方法如下:

public SearchStats[] sequentialSearchSet(int[] keys, int[] toSearch){
    SearchStats[] stats = new SearchStats[keys.length];

    for (int i = 0; i < keys.length; i++){
        stats[i] = sequentialSearch(keys[i], toSearch);
    }

    return stats;
}

这是sequentialSearch():

public SearchStats sequentialSearch(int key, int[] toSearch){

    long startTime = System.nanoTime(); // start timer

    // step through array one-by-one until key found
    for (int i = 0; i < toSearch.length; i++){
        if (toSearch[i] == key){
            return new SearchStats(key, i, System.nanoTime() - startTime);
        }
    }

    // did not find key
    return new SearchStats(key, -1, System.nanoTime() - startTime);
}

这是SearchStats构造函数:

public SearchStats(int keySearchedFor, int indexOfFound, long searchTime){
    this.keySearchedFor = keySearchedFor;
    this.indexOfFound = indexOfFound;
    this.searchTime = searchTime;
}

如果我进行试运行,则平均搜索时间为:

sequential search on sorted: 21,080 ns
sequential search on unsorted: 2,137,465 ns

如您所见,由于我首先搜索未排序的内容,因此搜索时间明显更长。 谁能解释为什么会这样? 而且,如何避免这种怪异?

这是由于VM“正在预热”。 简要总结一下,现代VM将通用代码路径编译为本地代码,并在运行时对其进行优化。 因此,围绕循环的前几次迭代,代码被解析,并且比优化开始后的代码要慢许多数量级。

在对Java进行性能分析时,这是一个常见的问题,通常的解决方案是在执行任何一个测得的测试之前, 被测代码进行数百万次测试。

有关更多详细信息和建议,您应该阅读有缺陷的微基准解剖图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM