Самый быстрый способ получить символ внутри строки с учетом индекса (PHP) - PullRequest
5 голосов
/ 01 октября 2011

Я знаю несколько способов получить символ из строки с учетом индекса.

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

Я не знаю, есть ли еще способы, если вы знаете что-нибудь, пожалуйста, не стесняйтесь добавлять его. Вопрос в том, если бы я выбрал и повторил метод, описанный выше, пару миллионов раз, возможно, используя mt_rand , чтобы получить значение индекса, этот метод был бы наиболее эффективным с точки зрения наименьшего потребления памяти и самым быстрым скорость

1 Ответ

18 голосов
/ 01 октября 2011

Чтобы получить ответ, вам нужно настроить тестовый стенд. Сравните все методы за несколько (сотни тысяч или миллионов) итераций на простое. Попробуйте встроенную функцию 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";
}
?>

Результаты:
РЕЗУЛЬТАТ ( Синтаксис идиоматических скобок PHP4 & 5 ): 0.19106006622314
РЕЗУЛЬТАТ ( функция среза строки ): 0.50699090957642
РЕЗУЛЬТАТ (* синтаксис индекса, будущее как устаревшие скобки *): 0.19102001190186

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...