Который быстрее: in_array () или набор выражений в PHP?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

15
задан hakre 9 September 2013 в 12:27
поделиться

5 ответов

я настоятельно рекомендовал бы просто использовать in_array(), любое различие в скорости будет незначительно, но удобочитаемость тестирования каждой переменной отдельно ужасна.

только для забавы вот тест, который я запустил:

$array = array('test1', 'test2', 'test3', 'test4');
$var = 'test';
$iterations = 1000000;

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    if ($var != 'test1' && $var != 'test2' && $var != 'test3' && $var != 'test4') {}
}
$end = microtime(true);

print "Time1: ". ($end - $start)."<br />";

$start2 = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    if (!in_array($var, $array) ) {}
}
$end2 = microtime(true);

print "Time2: ".($end2 - $start2)."<br />";

// Time1: 1.12536692619
// Time2: 1.57462596893

немного тривиальное примечание для наблюдения за, если $var не установлен, метод 1 берет намного дольше (в зависимости от того, сколько условий Вы тестируете)

17
ответ дан 1 December 2019 в 01:00
поделиться

Обратите внимание, что, если Вы надеетесь заменять набор !== операторы, необходимо передать третий параметр in_array как true, который осуществляет тип, проверяющий объекты в массиве.

Обычный != не требует этого, очевидно.

8
ответ дан 1 December 2019 в 01:00
поделиться

Первое будет быстрее - второе имеет много издержек: создание массива, вызывая функцию, ища массив...

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

Редактирование:

Мои синхронизации с кодом @Owen (PHP 5.2.6 / окна):

Time1: 1.33601498604
Time2: 4.9349629879

Перемещение массива (...) в цикле, как в вопросе:

Time1: 1.34736609459
Time2: 6.29464697838
6
ответ дан 1 December 2019 в 01:00
поделиться

in_array будет быстрее для больших количеств объектов. "большой" являющийся очень субъективным на основе большого количества факторов, связанных с данными и Вашим компьютером. Так как Вы спрашиваете, я предполагаю, что Вы не имеете дело с тривиальным количеством объектов. Для более длинных списков учтите эта информация и измерьте уровень с отраженным массивом так, чтобы php мог использовать поиски хеша вместо линейного поиска. Для "статического" массива, что тонкая настройка не может улучшить производительность, но она также может.

Используя тестовый код Owen, с отраженным массивом и большим количеством повторений для более последовательных результатов:

$array2 = array_flip($array);
$iterations = 10000000;

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    if (!isset($array2[$var])) {}
}
$end = microtime(true);
print "Time3: ".($end - $start)."<br />";

Time1: 12.875
Time2: 13.7037701607
Time3: 3.70514011383
2
ответ дан 1 December 2019 в 01:00
поделиться

Обратите внимание, что, поскольку RoBorg указал, существуют издержки в создании массива, таким образом, он должен быть перемещен в итеративном цикле. Поэтому сообщение Sparr также немного вводит в заблуждение, поскольку существуют издержки с функцией array_flip.

Вот другой пример со всеми 5 изменениями:

$array = array('test1', 'test2', 'test3', 'test4');
$var = 'test';
$iterations = 1000000;

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
   if ($var != 'test1' && $var != 'test2' && $var != 'test3' && $var != 'test4') {}
}
print "Time1: ". (microtime(true) - $start);

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
   if (!in_array($var, $array) ) {}
}
print "Time2: ".(microtime(true) - $start);

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
   if (!in_array($var, array('test1', 'test2', 'test3', 'test4')) ) {}
}
print "Time2a: ".(microtime(true) - $start);

$array2 = array_flip($array);
$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
  if (!isset($array2[$var])) {}
}
print "Time3: ".(microtime(true) - $start);

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    $array2 = array_flip($array);
  if (!isset($array2[$var])) {}
}
print "Time3a: ".(microtime(true) - $start);

Мои результаты:

Time1 : 0.59490108493 // straight comparison
Time2 : 0.83790588378 // array() outside loop - not accurate
Time2a: 2.16737604141 // array() inside loop
Time3 : 0.16908097267 // array_flip outside loop - not accurate
Time3a: 1.57209014893 // array_flip inside loop

, Таким образом, с помощью array_flip (с isset) быстрее, чем inarray, но не с такой скоростью, как прямое сравнение.

1
ответ дан 1 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: