PHP is_numeric vs ~ (~ (float) $ value) производительность и функция - PullRequest
1 голос
/ 01 апреля 2019

Недавно я хотел как можно быстрее найти в массиве числовые значения (целые, двойные числа и числа с порядковыми номерами).

Первоначально я использовал is_numeric (), поскольку мы часто используем его в качестве нашей проверки для проверки, но я хотел посмотреть, смогу ли я вставить что-то быстрее.

Я заметил, что если я приведу к плавающему значению, то, пока значение является числовым, PHP будет производить значение, отличное от нуля. Таким образом, используя побитовые операторы, я могу сделать логический НЕ ноль в операторе if, окружающем поиск.

if (~(~(float)$value)) {
// add to result array
}

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

Есть ли у кого-нибудь опыт выполнения приведения типа float против is_numeric? Я знаю, что они, вероятно, не на 100% функционально эквивалентны (я думаю, что приведение к числу с плавающей точкой будет преобразовывать шестнадцатеричное), но для моих целей я собираюсь только приводить целые числа, двойные числа и числа с обозначением экспоненты. Это увеличение производительности по сравнению с is_numeric () или я это себе представлял?

1 Ответ

1 голос
/ 01 апреля 2019

Внимание! isnumeric () - это не просто прихоть, я прилагаю небольшой фрагмент кода, который показывает вам ошибку, которую делает ваш тип конверсии. во многих атаках на php есть строки, которые могут быть как числами, так и скрипами, когда злоумышленники вводят плохой код.

Код:

<?php
$a="1809809808908099878758765<?php echo \"I powned you\"; ?>";
echo is_numeric($a)?"yes":"no";   // out no
echo "\n";
echo (~(~(float)$a))?"Yes":"No";  // out Yes 

если вы сделаете это таким образом, вы сможете повысить производительность, но в зависимости от того, что вам нужно сделать, вы можете открыть дыру в безопасности!

...