【问题标题】:How can I measure the execution time of a for loop?如何测量 for 循环的执行时间?
【发布时间】:2009-11-12 10:36:49
【问题描述】:

我想在php、c、python、Java、javascript等各种平台上测量for循环的执行时间......我该如何测量呢?

我知道这些平台,所以我说的是这些:

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

 }   

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

一点点修改:

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

我想在各种平台上循环计算每次迭代的执行时间..如何做到这一点???

编辑---

我知道Python Profilers 探查器模块...评估 cpu 时间...绝对时间..任何建议???同时我正在处理这个...

【问题讨论】:

  • 如果您解释为什么要这样做可能会有所帮助(除非只是为了学习如何)。您是否正在尝试优化某些特定代码?你在比较各种语言吗?
  • 由于循环中没有主体,许多编译器会认识到循环没有副作用,并简单地将其优化为不存在。几乎不可能测量“空”结构所需的时间,例如没有主体的“if”和没有主体的“while”。
  • @edan maor 是的,我正在比较各种语言,只是为了学习观点@S.Lott 你可以添加简单的方程,如 int x=0;然后继续增加它。
  • @piemesons:请不要评论您自己的问题。你“拥有”这个问题。你可以更新它。请更新问题以向您的问题添加更多事实。
  • 添加增量或类似循​​环体的东西会严重影响结果,因为增量所花费的时间与时间循环处理指令所花费的数量级相同。

标签: java php c++ python c


【解决方案1】:

尽管已经给出了 C++ 的答案,但从您的描述(“[您] 不想测量循环内的任何内容”)来看,就像您正在尝试测量程序迭代所花费的时间在一个空循环上。

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

【讨论】:

  • 你可以添加一个简单的方程,比如 int x=0;然后继续在循环内增加它。
  • 我听说过不用循环也能找出答案的编译器。
  • 还有什么让它更具挑战性; java编译器不断优化它遇到的部分代码。所以第一次迭代(如果有主体)可能会比上一次慢。
【解决方案2】:

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

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

我将从一个只执行循环的程序开始,并且(至少在 linux 环境中)执行time you-prg-executable

然后我会调查是否有类似time 的工具。不确定,但我会看看 JRat 用于 java,gcc 的 gcov 用于 C 和 C++。毫无疑问,其他语言也有类似的工具。但是,当然,您需要查看他们是否给出了实际时间。

【讨论】:

    【解决方案3】:

    javascript

    start = new Date;
    for(var i = 0; i < 1000000; i++) {}
    time = new Date - start;
    

    【讨论】:

      【解决方案4】:

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

      $ python -m timeit "for i in xrange(100): pass"
      100000 loops, best of 3: 2.5 usec per loop
      

      【讨论】:

        【解决方案5】:

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

        $start = microtime(true);
        
        for (...) {
           ....
        }
        
        $end = microtime(true);
        
        echo ($end - $start).' seconds';
        

        【讨论】:

          【解决方案6】:

          对于 C 和 C++ 等编译语言,请确保您的编译器标志设置为不会优化循环。启用优化后,我希望大多数编译器能够检测到循环中没有发生任何事情并将其优化掉。

          【讨论】:

          • 这是怎么回事?结果是 0 秒,这正是它们需要的时间。
          • 他可能想知道循环的开销。并且循环的开销不为 0,尽管我无法想象这是一个很大的开销。
          • “循环开销”问题的问题在于它过于简化了。您不能将程序的聚合属性完美地分配给各个语句。特别是在这种情况下,程序的“执行时间”属性不能简化为各个语句的执行时间的总和。
          【解决方案7】:

          如果您使用的是 Python,则可以使用专门为计时而构建的模块。它叫做 Timeit。

          以下是我找到的一些参考资料(刚刚用 Google 搜索过):

          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!
          

          【讨论】:

          • timeit 默认运行循环一百万次。根据 Python 的版本,使用 xrange 也可能会有所帮助,以免实际创建数字列表 0 ... 100
          • @UncleBens:你说得对,我完全忘记了这一点。编辑代码以添加它。
          【解决方案8】:

          在 php 中:(code timer)

          $timer = new timer();
          
          $timer->start();
          
           for(i=0;i<1000000;i++)
              {
          
              }
          
          $timer->stop();
          
          echo $timer->getTime(); 
          

          【讨论】:

          • php中默认没有timer!
          • 我知道,我忘了给链接!
          【解决方案9】:

          不久前我问了同样的问题,即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】:

            结果在空循环中没有意义,因为大多数编译器会在编译时优化它,在运行时之前。

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

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

            【讨论】:

              【解决方案11】:

              重点:只需获取当前时间之前做某事(这是开始时间)并获取当前时间之后一些东西(这是结束时间),然后只需做小学数学即可获得经过的时间。每个 API 都提供了获取当前时间的方法。例如,在 Java 中它是 System.currentTimeMillis()System.nanoTime()

              但是:尤其是在 Java 中,经过的时间并不总是那么可靠。可能存在细微差别,而且很大程度上取决于您进行测试的方式。我见过 test2() 比 test1() 快的情况,因为它执行得稍晚一些,并且当您将执行重新安排到 t​​est2() 和 test1() 时,它变得更慢

              最后但同样重要的是,微优化是万恶之源。

              【讨论】:

                【解决方案12】:

                对于 Java,Apache Commons LangSpring Framework 都有 StopWatch(请参阅 Apache 的 here 的 Java 文档)类,您可以使用它们来测量执行时间。在幕后虽然它只是减去System.currentTimeMillis(),但它并没有为您节省那么多代码来使用这个实用程序。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-07-27
                  • 1970-01-01
                  • 2014-07-18
                  • 2014-01-23
                  • 1970-01-01
                  • 2021-10-27
                  • 1970-01-01
                  • 2016-04-15
                  相关资源
                  最近更新 更多