繁体   English   中英

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

[英]How can I measure the execution time of a for loop?

我想测量php,c,python,Java,javascript等各种平台上for循环的执行时间。

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

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

 }   

我不想在循环中进行任何测量。

一点点修改:

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

我想计算各种平台上循环迭代的执行时间。该怎么做?

编辑 - -

我开始了解Python Profilers Profiler模块...这些模块可评估cpu时间...绝对时间..有什么建议吗?与此同时,我正在从事此工作...

尽管已经给出了C ++的答案,但是从您的描述中可以看出(“ [您]不想在循环中测量任何东西”),就像您试图测量程序在一个空的对象上进行迭代所花费的时间一样。环。

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

javascript

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

请注意,这还取决于您要实现的目标:您是否在乎程序因系统调度程序抢占而等待的时间? 上面的所有解决方案都考虑了实际花费的时间,但这还涉及其他进程(而不是您自己的)运行的时间。

如果您对此不关心,那么上面所有的解决方案都很好。 如果您确实在意,您可能需要一些配置文件软件才能真正了解循环所需的时间。

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

然后我调查是否有像time一样工作的工具。 不能确定,但​​是我将针对Java使用JRat,针对C和C ++使用gcc的gcov。 毫无疑问,其他语言也有类似的工具。 但是,当然,您需要查看它们是否给出了实际时间。

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

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

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

$start = microtime(true);

for (...) {
   ....
}

$end = microtime(true);

echo ($end - $start).' seconds';

如果您使用的是Python,则可以使用专门用于计时的模块。 这就是Timeit。

这是我找到的一些参考(只是用Google搜索):

  1. 深入Python:使用Timeit模块
  2. Python文档:Timeit模块

以下是一些示例代码,可帮助您快速入门:

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!

对于C和C ++之类的编译语言,请确保已设置编译器标志,以使循环不会被优化。 启用优化功能后,我希望大多数编译器都能检测到循环中没有任何事情并对其进行优化。

在php中:( 代码计时器

$timer = new timer();

$timer->start();

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

    }

$timer->stop();

echo $timer->getTime(); 

不久前,我问了一个专门针对c ++语言的问题 这是我最终使用的答案:

#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)

在空循环中,结果将毫无意义,因为大多数编译器会在运行时之前的编译时对其进行优化。

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

这是生物信息学算法的基准。 链接文本检查结果页面

直截了当:仅做某事之前的当前时间(这是开始时间 ),做某事的当前时间(这是结束时间 ),然后只需进行小学数学运算就可以得到经过的时间。 每个API都提供了获取当前时间的方法。 例如,在Java中,它是System.currentTimeMillis()System.nanoTime()

但是 :特别是在Java中,经过时间并不总是那么可靠。 可以有microdifferences,它也完全取决于你怎么做测试。 我已经看到了在test2()中比test1()更快的情况,因为它执行得晚一些,并且在将执行重新排列为test2()然后是test1()时,它变得更慢

最后但并非最不重要的一点是,微观优化是万恶之源。

对于Java, Apache Commons LangSpring Framework都具有StopWatch (请参见Java文档以获取Apache的信息 ),您可以将其用作衡量执行时间的一种方式。 在幕后,尽管它只是减去System.currentTimeMillis()而使用该实用程序并不会为您节省太多代码。

暂无
暂无

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

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