代码之家  ›  专栏  ›  技术社区  ›  Mohit Jain

如何测量for循环的执行时间?

  •  1
  • Mohit Jain  · 技术社区  · 15 年前

    我想测量 for循环 在各种平台上,如PHP、C、Python、Java、JavaScript…我如何测量它?

    我知道这些平台,所以我在谈论这些:

     for (i = 0; i < 1000000; i++)
     {
    
     }   
    

    我不想在循环中测量任何东西。

    小位修改:

    @我的一些朋友都说编译器会优化这个代码,使这个循环成为无用的循环。我同意这一点。我们可以添加一个小语句,比如一些增量语句,但事实上我只想计算不同语言循环中每次迭代的执行时间。通过添加一个增量语句,可以增加执行时间,从而影响结果,这会导致在各种平台上,增加值的执行时间也不同,这会使结果无效。 简言之,我更应该问:

    我想在不同的平台上计算循环中每次迭代的执行时间。如何做到这一点????

    编辑---

    我开始了解 Python Profilers 探查器模块…用于评估CPU时间…绝对时间..有什么建议吗?你说什么?同时我正在努力…

    12 回复  |  直到 11 年前
        1
  •  2
  •   laura    15 年前

    请注意,它还取决于您想要实现的具体目标:您关心程序由于被系统调度程序抢占而等待的时间吗?上面所有的解决方案都考虑了实际运行的时间,但这也涉及到其他进程运行的时间,而不是您自己运行的时间。

    如果你不关心这个,上面所有的解决方案都是好的。如果您真的关心,您可能需要一些分析软件来实际查看循环需要多长时间。

    我将从一个只做循环的程序开始,(至少在Linux环境中)做 time you-prg-executable .

    然后我会调查是否有像这样工作的工具 time .不确定,但我会看JAVA的Java,GCC的GCOV为C和C++。毫无疑问,其他语言也有类似的工具。但是,当然,你需要看看他们是否给出了实际的时间。

        2
  •  5
  •   Kaz Dragon    15 年前

    虽然已经给出了C++的答案,但它从你的描述(“你”不想测量循环内的任何东西)看出来,就像你在试图测量一个程序在一个空循环上迭代的时间一样。

    请注意:这不仅需要不同平台和处理器的不同时间,而且许多编译器将优化此类循环,有效地将任何循环大小的答案呈现为“0”。

        3
  •  2
  •   user187291    15 年前

    JavaScript

    start = new Date;
    for(var i = 0; i < 1000000; i++) {}
    time = new Date - start;
    
        4
  •  2
  •   Nadia Alramli    15 年前

    在python中正确的方法是从命令行运行timeit:

    $ python -m timeit "for i in xrange(100): pass"
    100000 loops, best of 3: 2.5 usec per loop
    
        5
  •  1
  •   bisko    15 年前

    PHP中不需要任何额外内容的其他版本:

    $start = microtime(true);
    
    for (...) {
       ....
    }
    
    $end = microtime(true);
    
    echo ($end - $start).' seconds';
    
        6
  •  1
  •   R Hyde    15 年前

    对于编译语言如C和C++,请确保编译器标志被设置为使得循环没有被优化。打开优化后,我希望大多数编译器能够检测到循环中没有发生任何事情,并将其优化掉。

        7
  •  1
  •   Edan Maor    15 年前

    如果您使用的是python,那么可以使用专门为计时而构建的模块。这叫时间。

    以下是我找到的一些参考资料(只是在谷歌上搜索):

    1. Dive Into Python: Using the Timeit Module
    2. Python Documentation: Timeit Module

    下面是一些让您快速入门的示例代码:

    import timeit
    t = timeit.Timer("for i in range(100): pass", "")
    # Timeit will run the statement 1,000,000 times by default, and return the time it took for all the runs together (it doesn't try to average them out or anything).
    t.timeit()
    2.9035916423318398 # This is the result. Don't forget (like I did in an earlier edit) that this is the result of running the code 1,000,000 times!
    
        8
  •  0
  •   manji    15 年前

    在PHP中: code timer )

    $timer = new timer();
    
    $timer->start();
    
     for(i=0;i<1000000;i++)
        {
    
        }
    
    $timer->stop();
    
    echo $timer->getTime(); 
    
        9
  •  0
  •   Community CDub    7 年前

    我以前也问过同样的问题 specifically for the c++ language . 以下是我最后使用的答案:

    #include <omp.h>
    
    // Starting the time measurement
    double start = omp_get_wtime();
    // Computations to be measured
    ...
    // Measuring the elapsed time
    double end = omp_get_wtime();
    // Time calculation (in seconds)
    
        10
  •  0
  •   mohdajami    15 年前

    在空循环中,结果是没有意义的,正弦大多数编译器会在运行时之前的编译时对其进行优化。

    为了比较语言的速度,您需要一个真正的算法,比如“合并排序”、“二进制搜索”或者“dijkstra”,如果您想要复杂的东西的话。 在所有语言中实现相同的算法,然后进行比较。

    这里是生物信息学算法的基准。 link text 检查结果页

        11
  •  0
  •   BalusC    15 年前

    重点:只需获得当前时间 之前 做某事(这是 开始时间 )得到当前时间 之后 做某事(这是 结束时间 )然后做小学数学,得到经过的时间。每个API都提供获取当前时间的方法。以Java为例 System.currentTimeMillis() System.nanoTime() .

    但是 特别是在Java中,经过的时间并不总是那么可靠。可能存在细微的差异,这也很大程度上取决于 怎样 你做测试。我见过这样的情况,在test2()中比test1()更快,因为它执行得稍晚,而且 更慢的 当您将执行重新排列到test2(),然后是test1()时。

    最后,微观优化是万恶之源。

        12
  •  0
  •   Jason Gritman    15 年前

    对于Java,两者都 Apache Commons Lang 以及 Spring Framework StopWatch (参见Apache的Java文档) here )可以用作度量执行时间的方法的类。尽管只是减法 System.currentTimeMillis() 使用这个实用程序并没有节省多少代码。