STR(C?)SPN ? А был ли смысл?

AnrDaemon

Продвинутый новичок
Наткнулся тут на кусочек кода, который явно писался под девизом "избегайте регулярных выражений, они замедляют ваш код!"
Задача - проверить строку на валидность (использование только разрешённых символов).
Соответственно, код
PHP:
if(strlen($string) > strspn($string, $mask)) ...
Мне лично пришлось минут пять вкуривать в описание функции.
Ради интереса, сварганил тестик:
PHP:
<?php

for( $i = 0 ; $i < 10000 ; $i++ )
{
$ARR[$i] = sprintf('%08X', $i);
}


// lower(STRSPN) on a string
$start = microtime(true);

for( $i = 0 ; $i < 10000 ; $i++ )
{
strlen($ARR[$i]) != strspn(strtolower($ARR[$i]), '0123456789abcdef');
}

$crc = microtime(true) - $start;

printf("%-11s %0.2f\n", "STRSPN+l", $crc);
unset($ARX);


// STRSPN on a string
$start = microtime(true);

for( $i = 0 ; $i < 10000 ; $i++ )
{
strlen($ARR[$i]) != strspn($ARR[$i], '0123456789ABCDEFabcdef');
}

$crc = microtime(true) - $start;

printf("%-11s %0.2f\n", "STRSPN", $crc);
unset($ARX);


// PREG_MATCH on a string
$start = microtime(true);

for( $i = 0 ; $i < 10000 ; $i++ )
{
preg_match('#[^0-9a-f]#i', $ARR[$i], $_s);
}

$crc = microtime(true) - $start;

printf("%-11s %0.2f\n", "PREG_MATCH", $crc);
unset($ARX);
Ну и? За что, спрашивается, боролись?…
Код:
STRSPN+l    0.09                                                                                                                 A
STRSPN      0.07
PREG_MATCH  0.05
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Такое иногда от бывших сишников бывает еще, а не от борцов с регулярками.
 

AnrDaemon

Продвинутый новичок
Ну, там не только этот конкретный код, просто именно это место у меня заняло больше всего времени на разбор.
Некоторые str* функции, действительно, работают быстрее аналогичных регулярок, особенно на одном прогоне.
Но вот конкретно этот код, мало того что оказался медленне, он ещё и жутко неочевидный.
 

AnrDaemon

Продвинутый новичок
Одного?… На локалхосте?… Кто тебе это сказал?…
А результаты у тебя интересные.
Проверил сейчас ещё на парочке OS - похоже, быстродействие сильно зависит от библиотек, с которыми собирался PHP.
Даже одна и та же версия на разных OS даёт совсем разные результаты. +/-100%
 
Сверху