2015-09-17 115 views
5

PHP有一個稱爲智能字符串(smart_str?)的內部數據結構,它們存儲長度和緩衝區大小。也就是說,分配的內存超過了字符串的長度以提高串聯性能。爲什麼這個數據結構不是用於實際的PHP字符串?這不會導致更少的內存分配和更好的性能嗎?爲什麼PHP不使用內部智能字符串作爲字符串?

+0

我們在談論多少個字節?大聲笑 –

+0

@AdamBuchananSmith什麼字節? –

+0

嗯...記憶。 –

回答

6

正常PHP字符串(從PHP 7開始)由zend_string類型表示,其中包括字符串的長度和其字符數據數組。通常會分配zend_string以精確地匹配字符數據(儘管對齊):他們不會留下附加字符的位置。

smart_str結構包括指向zend_string的指針和分配大小。這一次,zend_string而不是被精確分配。相反,分配將會變得太大,這樣可以附加額外的字符而不需要昂貴的重新分配。

smart_str的重新分配策略如下:首先,它將被分配爲總大小爲256個字節(減去zend_string頭,減去分配器開銷)。如果超過這個大小,它將被重新分配到4096字節(減去開銷)。之後,大小將以4096字節爲增量增加。

現在,想象一下,我們用smart_str來取代所有的字符串。這意味着即使是單個字符串也會有256字節的最小分配大小。鑑於大多數使用的字符串都很小,這是不可接受的開銷。

所以基本上,這是一個經典的性能/內存摺衷。默認情況下,我們使用內存壓縮表示,並且在從中受益最多的情況下切換到更快但更少的內存有效表示,即從小部分構建大型字符串的情況。

+0

當然,但您仍然可以調整'smart_str'以更好地適應正常PHP字符串處理的需要,對嗎?通過從小尺寸開始,然後每次連接發生時加倍。特別是因爲字符串緩衝區不可能在PHP(!)中實現。尤其是因爲內存比CPU週期更豐富。 –

+1

@OlleHärstedt是的,一旦開始存儲容量,很可能會找到一些合理的分配策略。我在這裏專門回答smart_str。一個相對安全的做法是與分配器集成,並且(對於小分配)選擇將要使用的下一個最大桶大小。有一些詭計,甚至有可能不引入額外的內存開銷來存儲容量(使用僞浮點編碼)。這就是HHVM所做的;) – NikiC

+0

嗯,你有鏈接來解釋這個騙局嗎?聽起來不錯。 –

相關問題