我想在各种平台上测量 for loops 的执行时间,如php,c,python,Java,javascript ......我该如何测量它?
我知道这些平台,所以我在谈论这些:
for (i = 0; i < 1000000; i++)
{
}
我不想在循环中测量任何东西。
稍作修改:
@all我的一些朋友说编译器会优化这段代码,使这个循环成为无用的循环。我同意这一点。我们可以像一些增量语句一样添加一个小语句,但事实是我只想在各种语言的循环中计算每次迭代的执行时间。通过添加增量语句将累计执行时间并将影响结果,因为在各种平台上,递增值的执行时间也不同,这将使结果无用。 简而言之,我应该更好地问:
我想在各种平台上计算循环中每次迭代的执行时间......如何做到这一点
编辑---
我开始了解Python Profilers Profiler模块...评估cpu时间...绝对时间..任何建议???同时我正在努力...
答案 0 :(得分:5)
虽然已经给出了C ++的答案,但它从你的描述中看起来(“[你]不想在循环中测量任何东西”),就像你试图测量程序迭代所需的时间一样空循环。
请注意:不仅需要不同时间从不同的平台和处理器,但许多编译器将优化这些循环,有效地将答案为“0”任何循环大小。
答案 1 :(得分:2)
的javascript
start = new Date;
for(var i = 0; i < 1000000; i++) {}
time = new Date - start;
答案 2 :(得分:2)
请注意,它还取决于您想要实现的目标:您是否关心程序因系统调度程序被抢占而等待的时间?上面的所有解决方案都考虑了实际时间,但这也涉及其他流程而不是您自己的流程运行的时间。
如果您不关心这一点,上述所有解决方案都是好的。如果您关心,您可能需要一些分析软件来实际查看循环所需的时间。
我从一个除了你的循环之外什么也不做的程序开始(至少在linux环境中)做time you-prg-executable
。
然后我会调查是否有像time
这样的工具。不确定,但我会看看JRat for java,以及gcc用于C和C ++的gcov。毫无疑问,其他语言也有类似的工具。但是,当然,你需要看看他们是否给出了实际的时间。
答案 3 :(得分:2)
在python中执行此操作的正确方法是从命令行运行timeit:
$ python -m timeit "for i in xrange(100): pass"
100000 loops, best of 3: 2.5 usec per loop
答案 4 :(得分:1)
PHP中的其他版本不需要任何额外的东西:
$start = microtime(true);
for (...) {
....
}
$end = microtime(true);
echo ($end - $start).' seconds';
答案 5 :(得分:1)
如果您正在使用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!
答案 6 :(得分:1)
对于C和C ++等编译语言,请确保设置编译器标志,以便不优化循环。在优化开启的情况下,我希望大多数编译器能够检测到循环中没有任何内容发生并进行优化。
答案 7 :(得分:0)
:( code timer)
$timer = new timer();
$timer->start();
for(i=0;i<1000000;i++)
{
}
$timer->stop();
echo $timer->getTime();
答案 8 :(得分: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)
答案 9 :(得分:0)
结果在空循环中没有意义,大多数编译器会在运行时之前的编译时优化它。
要比较语言速度,你需要一个真正的算法,如“Merge Sort”,“Binary Search”或者“Dijkstra”,如果你想要复杂的话。 在所有语言中实现相同的算法然后进行比较。
这是生物信息学算法的基准。 link text查看结果页面
答案 10 :(得分:0)
要点:在做某事之前获取当前时间(这是开始时间)并在之后获取当前时间某事(这是结束时间),然后只是做小学数学来获得经过的时间。每个API都提供了获取当前时间的方法。例如,在Java中,它是System.currentTimeMillis()
和System.nanoTime()
。
但是:特别是在Java中,经过的时间并不总是那么可靠。可能存在微差异,它也很大程度上取决于如何进行测试。我已经看到test2()比test1()更快的情况,因为稍后执行它并且当你将执行重新安排到test2()然后test1()时它变得更慢。
最后但同样重要的是,微观优化是万恶之源。
答案 11 :(得分:0)
对于Java,Apache Commons Lang和Spring Framework都有StopWatch
(请参阅Apache的here的Java文档)类,可以用它们来衡量执行时间。虽然它只是减去System.currentTimeMillis()
,但它并没有为你节省太多代码来使用这个实用程序。