比较两种Java方法的速度

时间:2018-11-05 12:46:54

标签: java performance

我有两种不同的方法,它们实际上是相同的,但实现的方式略有不同。他们浏览目录并读取其中的所有文件,并检查目录中有多少个具有特定名称的文件。现在我想知道哪个更快,但是两者都差不多,大约需要3-4秒(该目录包含数百万个文件),但是我怎么知道哪个真的更快?有没有可以比较它们速度的方法?

  1. 方法)

    private void getAllRelatedFilesEig(String corrId) throws InterruptedException, IOException
        {
    log.debug("Get all files with corrId=" + corrId + " from directory=" + processingDir);                  
    
    Profiler profiler = Profiler.createStarted();
    
        Files.list(Paths.get(processingDir))
        .filter(p -> 
        p.getFileName().toString()
        .indexOf("EPX_" + corrId + "_") >= 0)
        .forEach( path ->
        {
                    try
                    {
                        EPEXFile file = new EPEXFile(path);
    
                        if (file.isTranMessage())
                        {
                            if (file.isOrderMessage())
                            {                       
                                orderFiles.add(file);
                            }                       
                            else
                            {                       
                                tradeFiles.add(file);
                            }
                        }
                        else
                        {
                            infoFiles.add(file);
                        }
                    }
                    catch (IFException ex)
                    {
                        log.error("Error creating EPEXFile object " + ex.getMessage());
                    }
        }
                );
    
    profiler.stop("allFilesWithSameCorrIdRetrieval");
    
    log.info(orderFiles.size() + " order files with corrId=" + corrId);
    log.info(tradeFiles.size() + " trade files with corrId=" + corrId);
    log.info(infoFiles.size() + " info files with corrId=" + corrId);
    
    profiler = Profiler.createStarted();       
    
    profiler.stop("processFiles"); 
    
    orderFiles.clear();
    tradeFiles.clear();
    infoFiles.clear();
        }
    
  2. 方法)

    private void getAllRelatedFilesOrig(String corrId) throws InterruptedException, IOException {
    log.debug("Get all files with corrId=" + corrId + " from directory=" + processingDir);
    
    Path dirPath = Paths.get(processingDir);
    
    ArrayList<Path> fileList;
    
    Profiler profiler = Profiler.createStarted();
    
    try (Stream<Path> paths = Files.walk(dirPath)) {
        fileList = paths.filter(t -> (t.getFileName().toString().indexOf("EPX_" + corrId + "_") >= 0))
                .collect(Collectors.toCollection(ArrayList::new));
    
        for (Path path : fileList) {
            try {
                EPEXFile file = new EPEXFile(path);
    
                if (file.isTranMessage()) {
                    if (file.isOrderMessage()) {
                        orderFiles.add(file);
                    } else {
                        tradeFiles.add(file);
                    }
                } else {
                    infoFiles.add(file);
                }
            } catch (IFException ex) {
                log.error("Error creating EPEXFile object " + ex.getMessage());
            }
        }
    }
    profiler.stop("allFilesWithSameCorrIdRetrieval");
    
    log.info(orderFiles.size() + " order files with corrId=" + corrId);
    log.info(tradeFiles.size() + " trade files with corrId=" + corrId);
    log.info(infoFiles.size() + " info files with corrId=" + corrId);
    
    profiler = Profiler.createStarted();
    
    profiler.stop("processFiles");
    
    orderFiles.clear();
    tradeFiles.clear();
    infoFiles.clear();
    }
    

我试图通过Profiler类来解决这个问题,但是我无法弄清楚哪个速度更快,因为有时第一个和第二个更快。甚至还有一种方法可以说总体上哪个更快?即使速度快一点,它也会帮助我知道它是哪一个。

1 个答案:

答案 0 :(得分:1)

我最近编写了此方法来测试我的两个方法,它们在做完全相同的事情时会有所不同。

private void benchMark(){

    long t, t1=0, t2 =0;

    for (int i =0; i< 50; i++){
        t= System.currentTimeMillis();
        method1();
        t1 += System.currentTimeMillis()-t;


        t= System.currentTimeMillis();
        method2();
        t2+= System.currentTimeMillis()-t;
    }


    System.out.println("Benchmarking\n\tMethod 1 took + "+t1+" ms\n\tMethod 2 took "+t2+" ms");
}

这是一种蛮横的方法,但是它有效,因为我发现我的一种方法在每次测试中始终保持约5%的速度。

我依次调用这些方法以减小测试过程中性能变化的影响。