[英]Does really SplFixedArray perform better than arrays?
我正在測試 SplFixedArray 用星期幾構建一個數組,我得到以下結果:
<?php
$days = new SplFixedArray(7);
$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";
echo memory_get_peak_usage() . "\n"; //Returns 327688
echo memory_get_usage() . "\n"; //Returns 327140
echo memory_get_peak_usage(true) . "\n"; //Returns 524288
echo memory_get_usage(true) . "\n"; //Returns 524288
使用傳統數組:
<?php
$days = array();
$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";
echo memory_get_peak_usage() . "\n"; //Returns 327528
echo memory_get_usage() . "\n"; //Returns 326820
echo memory_get_peak_usage(true) . "\n"; //Returns 524288
echo memory_get_usage(true) . "\n"; //Returns 524288
這對你有意義嗎?
正如本文作者執行的基准測試所示:
可以得出結論,SplFixedArray 的內存占用確實較小,但僅在大量數組元素時才會引起注意。 因為 SplFixedArray 在技術上也是一個類的實例,而不是傳統數組,這就是導致小數組實際上在 SplFixedArray 實現時消耗更多內存的原因,但由於這額外的幾百字節保持不變,它變得無關緊要隨着數組大小的增長。
旁注:不要進行微觀優化,並非每個錘子都是為每個釘子創建的。 SplFixedArray 適用於極端情況,例如,對於包含數十萬個元素的數組,在這種情況下,將每個元素的內存使用量減少幾個字節會對整體內存使用量產生很大影響; 但不要費心使用它,除非你真的確定你的陣列是或可能是應用程序的潛在瓶頸。
SplFixedArray 應該比數組更快。 它沒有說明內存消耗(這是您在此處測試的內容)。 來自http://php.net/manual/en/class.splfixedarray.php :
“SplFixedArray 和普通 PHP 數組之間的主要區別是 SplFixedArray 是固定長度的,並且只允許范圍內的整數作為索引。優點是它允許更快的數組實現”
然而,使用一個包含 100000 個條目的數組,表明它也使用了更少的 RAM:
$users = array();
for ($i=0;$i<100000;$i++) {
$users[$i] = array('id' => rand(), 'name' => 'default');
}
echo memory_get_peak_usage(true); //returns 31457280
$users = new SplFixedArray(100000);
for ($i=0;$i<100000;$i++) {
$users[$i] = array('id' => rand(),
'name' => 'default');
}
echo memory_get_peak_usage(true); //return 26738688
是的,如果您使用固定尺寸的它們。
如果您不斷更改要添加的每個新元素的大小,則可能會變慢,而且這也可能不是錯誤的用法。
由於在 PHP 中實現了數組,因此速度更快,因為根據編程語言的定義,這些數組不是真正的數組,而是關聯數組,使用哈希表實現。 (所以 PHP 中的數組基本上是哈希表)
雖然 SplFixedArray 是使用 C 的“malloc”實現的,作為一個幾乎正常的 C 數組,當然包裝在一個小結構中以根據用例跟蹤和操作數組。
更新
同時,從 PHP 7.x 開始,性能上沒有太大的時間差異。 真正了解的唯一方法是根據您自己的用例進行基准測試。 如果沒有特殊要求,普通的PHP array
就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.