簡體   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