2011-06-16 66 views
-2

我目前正試圖找到解決我目前的問題。php大對象/數組循環性能

給下面的代碼:

$array = array(); 
for($a=0;$a!=100000;$a++) { 
    $std = new \stdClass(); 
    $array[] = $std; 
    $count = count($array); 
    for($i=0;$i!=$count;$i++); 
} 

大約需要3.0082960128784秒:

$array = array(); 
for($a=0;$a!=1000;$a++) { 
    $std = new \stdClass(); 
    $array[] = $std; 
    $count = count($array); 
    for($i=0;$i!=$count;$i++); 
} 

PHP將圍繞0.052025079727173秒

給予運行該腳本。

考慮:

$array = array(); 
for($a=0;$a!=100000;$a++) { 
    $std = new \stdClass(); 
    $array[] = $std; 
    $count = count($array); 
    //for($i=0;$i!=$count;$i++); 
} 

運行在0.3171501159668。

現在我明白我正在高速循環,而且我還沒有進入這個領域。

所以我的問題是這只是錯誤的,它應該以不同的方式處理,PHP不處理非常好的大數據集處理或循環大量的數據,而不是任何語言的明智的想法。

+4

你想完成什麼?有什麼問題?我所看到的是,當你循環更多次時,需要更長的時間。這應該很明顯,但是問題是什麼? – Wiseguy 2011-06-16 16:23:00

+1

不是一個真正的答案,但你想要做什麼?在你的例子中,你不是遍歷數據,只是增加一個整數並且用另一個值檢查它的值,值得指出你的目標是什麼,這樣我們可以給你一個更好的方法來實現它(如果有的話)。在你的「緩慢」的例子中,你循環了100000 * 100000次,併爲每次迭代進行比較和遞增。 – Lepidosteus 2011-06-16 16:23:47

+1

您可能會用完內存。 – 2011-06-16 16:23:59

回答

1

此問題已得到很好的解決,並在計算機科學界被正式稱爲「大O」符號。下面是描述Big-O符號的文章link。此時,由於該較大循環內部的嵌套/嵌入循環,Big-O值呈指數形式。

我應該注意你在做什麼並沒有錯,而且PHP能夠處理大量的數據,但是正如Coding Freak指出的那樣,你可能會用完內存。我不知道你想要做什麼的背景,但也許考慮在「根據需要」的基礎上進行操作,這會稍微提高你的性能,因爲你不會初始化/設置/修改整個塊的數據,除非你正在嘗試執行某種大批量操作(我正在考慮頁面加載時間,如果你正在做一個大批量操作,每天只發生一次,那麼就不用擔心了關於)。

您可能想要考慮採用不同的方式來處理您的計算,但由於您沒有真正發佈您希望實現的目標,我在提供解決方案方面相當有限。

這是一個非常小的一面評論,但是當你正在做循環時,如果由於某種原因,你的增量變量超過1000,請不要使用這種方法檢查「i!= 1000」做「i < 1000」你不會以無限循環結束。就像我說的,一個非常小的評論 - 在您的代碼中,這不是必要的,但也不是最好的做法,因爲它可能導致錯誤。

問候,

^h

+0

「此時,你的Big-O值是指數「它對我來說看起來是二次方的。 – 2011-06-16 16:42:14

+0

@Joey Adams,我站好了,謝謝:) – hypervisor666 2011-06-16 17:14:17

0

循環數據量非常大的根本就不是一個明智的想法在任何語言

是的! :)

2

所以我的問題是這只是錯誤的,它應該以不同的方式處理,PHP沒有處理大量數據集非常好或循環大量的數據根本不是任何語言的明智的想法。

表現明智的PHP並不像C代碼或彙編器那麼快。但那不會導致什麼。

所以做很多迭代總是需要時間。用任何語言。你有很多,所以這需要時間。所以不要爲了好玩而做循環,而是要真正完成某些事情;)。

+1

所以,不要爲了好玩而做循環,我喜歡它給你一個 – 2011-06-16 16:27:43

0

這行是不必要的:

$count = count($array); 

你應該知道數組數是什麼,你不必再算上這一輪每次循環。嘗試替換它,看看性能是否更好。

HTH。

+0

'count()'函數是O(1),至少如果[這個人說什麼](http://www.php.net/manual/en /function.count.php#101882)爲真。 – 2011-06-16 16:39:48