2009-11-12 518 views
1

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

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

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

} 

我不想测量回路中任何东西。

点点修改:

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

我想要计算一个循环中每次迭代的执行时间在各种平台上..怎么做?

编辑---

我来了解Python Profilers 探查器模块......这些评价cpu时间......绝对时间。任何建议???同时我对这个工作...

+3

如果你解释你为什么要这样做(除非是为了学习如何),这可能会有所帮助。有没有一些你想要优化的特定代码?你在比较各种语言吗? – 2009-11-12 10:54:52

+5

循环中没有任何主体,很多编译器会认识到循环没有副作用,只是简单地优化它。几乎不可能测量“空”结构所需的时间,比如没有身体的“如果”和没有身体的“同时”。 – 2009-11-12 11:01:04

+0

@edan maor 雅我是比较各种语言,没有这样的只是为了学习的角度 @ S.Lott 你可以添加简单的公式,如int x = 0;然后继续增加它。 – 2009-11-12 11:40:39

回答

2

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

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

我用的程序,做什么,但你的循环,并(在Linux环境中至少)做time you-prg-executable开始。

其次,如果有这工作就像time工具,我会进行调查。不知道,但我会看看JRat for Java,以及gcc的C和C++的gcov。毫无疑问,其他语言也有类似的工具。但是,当然,你需要看看他们是否给予实际的时间。

0

在PHP中:(code timer

$timer = new timer(); 

$timer->start(); 

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

    } 

$timer->stop(); 

echo $timer->getTime(); 
+0

定时器在php中是不会默认的! – bisko 2009-11-12 10:45:12

+0

我知道,我忘了给链接! – manji 2009-11-12 10:45:39

0

我问同样的问题而回,这是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) 
1

在PHP中的其他版本,不需要任何额外的东西:如果你使用的是Python

$start = microtime(true); 

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

$end = microtime(true); 

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

,您可以使用专门打造一个模块为了计时的事情。它被称为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! 
+1

timeit默认运行循环一百万次。根据Python的版本,它也可能有助于使用xrange,以免实际创建数字列表0 ... 100 – UncleBens 2009-11-12 11:12:42

+0

@UncleBens:你说得对,我完全忘了那个。编辑代码添加。 – 2009-11-12 13:25:29

1

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

+6

这个问题怎么样?你得到0秒,这正是他们需要多长时间。 – MSalters 2009-11-12 10:54:05

+0

他可能想知道循环的开销。一个循环没有0的开销,但我无法想象这是一个很大的开销。 – extraneon 2009-11-12 12:25:22

+0

“循环开销”问题的问题在于它过于简化。你不能完美地将程序的aggegate属性分配给单个语句。特别是在这种情况下,程序的“执行时间”属性不能简化为单个语句执行次数的总和。 – MSalters 2009-11-12 12:47:07

5

虽然答案已经给出了C++,它看起来从你的描述(“[你]不想来衡量环路内的任何”)就像你试图测量它需要一个程序的时候迭代一个空循环。

在这里照顾:它不仅将采取不同的时间,不同的平台和处理器,但许多编译器将优化掉这样的循环,从而有效地使答案为“0”的任何环的大小。

+0

你可以添加一个简单的方程,如int x = 0;然后继续在循环内部递增它。 – 2009-11-12 11:42:04

+0

我听说过编译器,仍然可以找出没有循环的答案。 – UncleBens 2009-11-12 11:48:27

+0

什么使它更具挑战性; java编译器不断优化它遇到部分代码的频率。所以第一次迭代(如果有一个实体)可能会比最后一次慢。 – extraneon 2009-11-12 12:23:51

2

的JavaScript

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

做在Python正确的方法是在命令行中运行timeit:

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

结果不会让感的空循环,正弦大多数编译器将在编译时进行优化,前运行。

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

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

0

的一点是:刚刚得到的当前时间之前做的事情(这是开始时间),并获取当前时间后做的事情(这是结束时间 ),然后只是做小学数学来获得流逝的时间。每个API都提供获取当前时间的方法。在Java中,例如它是System.currentTimeMillis()System.nanoTime()

但是:特别是在Java中,经过的时间并不总是可靠的。可以有微差异,它也取决于如何你做测试。我已经看到在test2()比test1()更快的情况下,因为它稍后执行,并且当您将执行重新安排到test2()和test1()时,它会变得更慢。

最后但并非最不重要的是,微优化是所有邪恶的根源。

0

对于Java,既Apache Commons LangSpring FrameworkStopWatch(见Apache的here了Java文档),您可以作为一种方法来衡量的执行时间使用类。尽管它只是减去System.currentTimeMillis(),并没有为你节省那么多的代码来使用这个工具。