2015-02-09 3 views
-6

Что быстрее использовать при создании строк? implode(), sprintf() или обычная конкатенация переменных?PHP implode() vs sprintf() vs concat

Почему, спросите вы? Это может не заинтриговать вас, чтобы проверить такую ​​небольшую деталь о генерации строк, так как кого это волнует, все в ms не так ли? На самом деле, нет! Не тогда, когда вам нужно сгенерировать тонны строк из заданных переменных, а это значит, что мелкие 0,00xms могут повлиять. В моем случае он генерировал ключи кеша из данного префикса, типа контента и идентификатора.

+1

Ответ почти наверняка простой конкатенации; но почему вы не можете проверить это сами? –

+0

@MarkBaker Я сам отвечал на него, отправляя результаты. – Mulkave

+0

Конечно, существует также 'echo '{$ id}: {$ type}: {$ prefix}"; ', который, вероятно, будет меньше, чем любой из ваших других опций. ' –

ответ

-8

Итак, я сделал это на очень простом, минималистичном наборе данных.

Вот результаты и код следующим образом:

Результаты

  • комментарии: статьи: 123456 Implode принял: 0.00011706352233887
  • комментарии: статья: 123456 Sprintf принял: 2.4080276489258E -5
  • комментарии: артикул: 123456 concat взял: 6.9141387939453E-6
  • concat - самый быстрый!

Код

function microtime_float() 
{ 
    list($usec, $sec) = explode(" ", microtime()); 
    return ((float)$usec + (float)$sec); 
} 


// vars 

$id = 123456; 
$type = 'article'; 
$prefix = 'comments'; 


$implode_time_start = microtime_float(); 

echo implode(':', array($prefix, $type, $id)); 

echo "\n"; 

$implode_time_end = microtime_float(); 
$implode_time = $implode_time_end - $implode_time_start; 

echo "implode took: $implode_time"; 

echo "-----\n\n\n"; 


$sprintf_time_start = microtime_float(); 

echo sprintf('%s:%s:%s', $prefix, $type, $id); 

echo "\n"; 

$sprintf_time_end = microtime_float(); 
$sprintf_time = $sprintf_time_end - $sprintf_time_start; 

echo "sprintf took: $sprintf_time"; 

echo "-----\n\n\n"; 


$concat_time_start = microtime_float(); 

echo $prefix.':'.$type.':'.$id; 

echo "\n"; 

$concat_time_end = microtime_float(); 
$concat_time = $concat_time_end - $concat_time_start; 

echo "concat took: $concat_time"; 

echo "------\n\n\n"; 


if ($implode_time < $sprintf_time || $implode_time < $concat_time) { 
    echo "implode is fastest!"; 
} elseif ($concat_time < $sprintf_time) { 
    echo "concat is fastest!"; 
} else { 
    echo "sprintf is fastest!"; 
} 

Пожалуйста, поделитесь своими мыслями!

+1

Добавьте это к вопросу. Не указывайте дополнительные детали в качестве ответа. Измените свой вопрос – Gunaseelan

+2

Если я честен, я думаю, что это довольно дешевый захват кармы, но, во всяком случае, вы должны хотя бы запускать каждый тест несколько раз, скажем, по 1000 раз. Один раз бессмысленно и ничего не говорит. –

+0

@Bulk звучит хорошо. Будет делать это и обновлять. – Mulkave