Что быстрее - проверка логической переменной или is_null ()? - PullRequest
3 голосов
/ 24 января 2012

Предположим, я создаю класс сеанса с соответствующей реализацией, как показано ниже:

public class Session()
{
    private $id;
    private $user;
}

Поле $user содержит объект типа User, если сеанс вошел в систему, и равен нулю, еслисеанс не авторизован на сайте.$id является идентификатором сеанса.

Предположим, теперь я хочу выяснить, вошел ли пользователь в систему. Очевидно, я мог бы проверить, равен ли $ user нулю, если это так, то пользователь не является пользователем.не вошли в систему - что-то вроде этого:

public class Session()
{
    private $id;
    private $user;

    public function isLoggedIn()
    {
        return !is_null($user);
    }
}

В качестве альтернативы, я мог бы сохранить логическую переменную сеанса, $loggedIn или что-то подобное, установить значение false при входе в систему и иначе инициализировать в конструкторе, чтобы получить значение false длявместо этого проверьте:

public class Session()
{
    private $id;
    private $user;
    private $loggedIn;

    public function isLoggedIn()
    {
        return $loggedIn;
    }
}

Будет ли один подход привести к более высокой производительности, чем другой здесь?Если да, то что и почему?В качестве альтернативы, является ли один подход предпочтительнее другого по любой причине, не связанной с производительностью?

Ответы [ 5 ]

10 голосов
/ 24 января 2012

При проверке php.net для оценки в этом сообщении, добавленном пользователем ( ссылка на сообщение ), мы видим, что == и === намного быстрее, чем is_null.

6 голосов
/ 24 января 2012

Чем проще, тем лучше.Если вы вводите новую переменную для отслеживания того, является ли $ user нулевым, тогда вы также вводите возможность того, что is_null ($ user) и $ loggedIn не совпадают.Избегать хлопот, связанных с этим, стоит гораздо больше, чем любая возможная микрооптимизация, которую вы можете получить в производительности.

3 голосов
/ 24 января 2012

Я бы сказал, что лучший способ сделать это:

return ($user !== null)

1 голос
/ 24 января 2012

Самый быстрый метод: isset():

public function isLoggedIn() {
    return isset($this->user);
}

Функция isset() возвращает TRUE, если переменная установлена ​​(существует) и не является NULL, или FALSE в противном случае.

Это намного быстрее, чем !is_null() и !empty(), и незначительно быстрее, чем !== NULL, как при значении NULL, так и когда оно не NULL.

0 голосов
/ 25 января 2012

Вы действительно можете решить свою проблему с помощью cast to bool :

public function isLoggedIn()
{
    return (bool) $this->user;
}

Каждый объект TRUE, а NULL - FALSE в PHP.

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

Вы не знаете двух важных вещей: мой код слишком медленный? Какой из них быстрее? Если вы не можете ответить на первый вопрос вообще, тогда даже не думайте спрашивать второй.

Вы вкладываете в свой мозг только то, что никогда не будете использовать. Это распространенная ошибка, которую делают неопытные программисты , поэтому чем раньше вы остановитесь на этом, тем быстрее вы получите результаты, с которыми сможете работать. И чем легче вы сохраняете свой код с самого начала, тем меньше узких мест вы будете выполнять. И те, с которыми вы столкнетесь, не станут для вас проблемой, потому что нечего менять, чтобы убрать скачки производительности. Звучит справедливо?

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