2011-10-01 114 views
5

我知道有幾種方法可以從給定索引的字符串中獲取字符。在給定索引的字符串中獲取字符的最快方法(PHP)

<?php 
$string = 'abcd'; 
echo $string[2]; 
echo $string{2}; 
echo substr($string, 2, 1); 
?> 

我不知道是否有更多的方法,如果你知道任何請不要猶豫添加它。問題是,如果我要選擇並重復一種高於幾百萬次的方法,可能使用mt_rand來獲得索引值,哪種方法在最少內存消耗和最快速度方面最有效?

+1

'$ string [2]'或'$ string {2}'的速度和內存消耗應該相同,並且e其中的ither應該比substr更快。 – anubhava

回答

18

要獲得答案,您需要設置基準測試裝備。比較空閒盒子上幾次(幾十萬次或數百萬次)迭代的所有方法。嘗試使用內置的microtime函數來測量開始和結束之間的差異。這是你的流逝時間。

該測試應該帶你所有的2分鐘寫。

爲了節省您的一些努力,我寫了一個測試。我自己的測試表明功能解決方案(substr)慢得多(預期)。慣用的PHP({})解決方案與索引方法一樣快。它們可以互換。 ([])是首選,因爲這是PHP正在進行有關字符串偏移的方向。

<?php 
$string = 'abcd'; 
$limit = 1000000; 

$r = array(); // results 

// PHP idiomatic string index method 
$s = microtime(true); 
for ($i = 0; $i < $limit; ++$i) { 
    $c = $string{2}; 
} 
$r[] = microtime(true) - $s; 
echo "\n"; 

// PHP functional solution 
$s = microtime(true); 
for ($i = 0; $i < $limit; ++$i) { 
    $c = substr($string, 2, 1); 
} 
$r[] = microtime(true) - $s; 
echo "\n"; 

// index method 
$s = microtime(true); 
for ($i = 0; $i < $limit; ++$i) { 
    $c = $string[2]; 
} 
$r[] = microtime(true) - $s; 
echo "\n"; 


// RESULTS 
foreach ($r as $i => $v) { 
    echo "RESULT ($i): $v \n"; 
} 
?> 

結果:
RESULT(PHP4 & 5個慣用括號語法):0.19106006622314
RESULT(串切片功能):0.50699090957642
RESULT(* index語法,今後隨着大括號已被棄用*):0.19102001190186

相關問題