2009-11-12 33 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(),並沒有爲你節省那麼多的代碼來使用這個工具。