有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是一种计算排序算法所需时间的合适方法

(使用Java)

我正在测试排序数组,看看不同的排序数组的速度有多快。我想剔除错误的时间,所以理想情况下我想启动一个计时器,在循环中运行排序,比如说100次,停止计时器,然后除以100得到一个非常准确的测量值

问题是,如果我循环同一个数组,第一次它会正确排序,然后每次排序之后,它会继续排序已经排序的数组,这不是我想要的

也许我错过了一个明显的解决方案,但有没有办法让它继续对相同的初始随机数组排序

我想每次都把新排序的数组重新分配回初始的随机数组,但那会弄乱我的计时器

谢谢你的建议

我想做的是:

        startTime = System.nanoTime();
        for(int i=0; i<cntr; i++) {
            sort array
        }
        endTime = System.nanoTime();
        time = (endTime - startTime)/cntr;

共 (3) 个答案

  1. # 1 楼答案

    可以使用System.currentTimeMillis()方法获取当前时间,然后在该方法完成执行时进行减法

    long totalRuntime = 0;
    
    for(int i = 0; i < 100; i++)
    {
       long startTime = System.currentTimeMillis();
       sortArrays()
       long endTime = System.currentTimeMillis();
    
       totalRuntime += (endTime - startTime);
    }
    
    System.out.println("Algorithm X on average took " 
                        + totalRuntime/100 + " milliseconds);
    

    如果你想做X次,只需为每个算法和增量保留一个计数器。然后你可以除以最后的总跑步次数并进行比较

  2. # 2 楼答案

    通常,在测试算法的每次运行之间,你会停止并启动计时器,将各个时间相加,然后除以运行次数。这样就不包括任何“设置时间”,因为在设置期间计时器没有运行

  3. # 3 楼答案

    如果你想耗尽内存,那么在开始计时之前,只需复制100个(或多个)相同阵列的副本即可。如果你没有,那就一起排序和复制,然后再花点时间只是复制,看看你的排序+复制时间中大约有多少是花在复制上的

    另外,旁注:考虑使用像Caliper这样的基准测试框架,而不是自己进行“手动”基准测试。这更容易,而且他们已经解决了很多你可能甚至不知道正在发生的问题,这些问题可能会扰乱你的时间安排