2009-11-05 4 views
0

Мне нужно извлечь имя виртуального хоста HTTP-запроса. Поскольку это будет сделано для каждого запроса, я ищу самый быстрый способ сделать это.Есть ли способ сделать это извлечение строк быстрее?

Следующий код и время - это лишь некоторые из способов изучения.

Итак, есть ли более быстрый способ сделать это?

$hostname = "alphabeta.gama.com"; 

$iteractions = 100000; 

//While Test 

$time_start = microtime(true); 
for($i=0;$i < $iteractions; $i++){ 
    $vhost = ""; 
    while(($i < 20) && ($hostname{$i} != '.')) $vhost .= $hostname{$i++}; 
} 

$time_end = microtime(true); 
$timewhile = $time_end - $time_start; 

//Regexp Test 
$time_start = microtime(true); 
for($i=0; $i<$iteractions; $i++){ 
    $vhost = ""; 
    preg_match("/([A-Za-z])*/", $hostname ,$vals); 
    $vhost = $vals[0]; 
} 
$time_end = microtime(true); 
$timeregex = $time_end - $time_start; 

//Substring Test 
$time_start = microtime(true); 
for($i=0;$i<$iteractions;$i++){ 
    $vhost = ""; 
    $vhost = substr($hostname,0,strpos($hostname,'.')); 
} 
$time_end = microtime(true); 
$timesubstr = $time_end - $time_start; 

//Explode Test 
$time_start = microtime(true); 
for($i=0;$i<$iteractions;$i++){ 
    $vhost = ""; 
    list($vhost) = explode(".",$hostname); 
} 
$time_end = microtime(true); 
$timeexplode = $time_end - $time_start; 

//Strreplace Test. Must have the final part of the string fixed. 
$time_start = microtime(true); 
for($i=0;$i<$iteractions;$i++){ 
    $vhost = ""; 
    $vhost = str_replace(".gama.com","",$hostname); 
} 
$time_end = microtime(true); 
$timereplace = $time_end - $time_start; 

echo "While :".$timewhile."\n"; 
echo "Regex :".$timeregex."\n"; 
echo "Substr :".$timesubstr."\n"; 
echo "Explode :".$timeexplode."\n"; 
echo "Replace :".$timereplace."\n"; 

И как результат тайминги:

 
While :0.0886390209198 
Regex :1.22981309891 
Substr :0.338994979858 
Explode :0.450794935226 
Replace :0.33411693573 
+6

Уверены ли, что это более медленная часть вашего кода? Оптимизация производительности должна быть выполнена для самого медленного кода, иначе это может быть отходом. –

+0

Согласен, но сейчас настало время для мелочей;) –

+3

@Ivan -exactly. Если вы следуете этому соединением с базой данных, вы теряете время. помните, что вы не делаете этого 100k раз для каждого запроса. даже с вашим самым медленным методом, вы бы добавляли в общей сложности 1,2 секунды для каждых 100 тыс. запросов. –

ответ

5

Вы могли бы попробовать функцию strtok():

$vhost = strtok($hostname, ".") 

Это быстрее, чем правильная версия вашего время цикла, и много более читаемым.

+0

Strtok timing: 0.234637975693 –

+1

@Ville Хорошая идея. @Renato, это улучшение около 2 микросекунд от самого медленного. хорошая работа. lol –

+0

Кстати, поскольку скорость для вас так важна, вы используете какой-то ускоритель PHP? –

3

Я сделал бы это путь substr().

$vhost = substr($host, 0, strstr($host, ".")); 

И я действительно не думаю, что способ разделения этой строки повлияет на производительность в любой реальной программе. 100 000 итераций довольно огромные ... ;-)

+1

Алекс, вы, Иван, Байрон и любой другой человек, который говорит, что это пустая трата времени, «эта оптимизация» в реальном мире правильна. Я просто ищу ответ на вопрос: «Есть ли более быстрый способ сделать это?" Спасибо за ваш ответ –

+0

Хорошо, из-за интереса, насколько быстро это substr ($ host, 0, strstr ($ host,". "))? – Alex

+1

strpos вместо strstr должен быть быстрее. –

0
<?php 
$iterations = 100000; 
$fullhost = 'subdomain.domain.tld'; 

$start = microtime(true); 

for($i = 0; $i < $iterations; $i++) 
{ 
    $vhost = substr($fullhost, 0, strpos($fullhost, '.')); 
} 

$total = microtime(true) - $start; 
printf('extracted %s from %s %d times in %s seconds', $vhost, $fullhost, $iterations, number_format($total,5)); 
?> 

извлекаемых поддомены из subdomain.domain.tld 100000 раз в 0.44695 секундах

Но это было при кодировании видео, так что, вероятно, будет быстрее под лучшие обстоятельства.

+0

Хе-хе, я пропустил тот факт, что у вас уже было это в вашем коде, но заметил, что это неловкое (для меня) использование strstr для Alex, и мне захотелось попробовать это. – Kris

+0

Спасибо за попытку Криса. –