Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
я настоятельно рекомендовал бы просто использовать 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 берет намного дольше (в зависимости от того, сколько условий Вы тестируете)
Обратите внимание, что, если Вы надеетесь заменять набор !==
операторы, необходимо передать третий параметр in_array
как true
, который осуществляет тип, проверяющий объекты в массиве.
Обычный !=
не требует этого, очевидно.
Первое будет быстрее - второе имеет много издержек: создание массива, вызывая функцию, ища массив...
Однако, поскольку я сказал в вопросе несколько ответов вниз, преждевременная оптимизация является корнем всего зла. Необходимо написать код, чтобы быть читаемыми, затем , если он должен быть оптимизирован, представляют его, затем оптимизируют.
Редактирование:
Мои синхронизации с кодом @Owen (PHP 5.2.6 / окна):
Time1: 1.33601498604
Time2: 4.9349629879
Перемещение массива (...) в цикле, как в вопросе:
Time1: 1.34736609459
Time2: 6.29464697838
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
Обратите внимание, что, поскольку 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, но не с такой скоростью, как прямое сравнение.