哪个更快 - 布尔变量检查或is_null()?

时间:2012-01-24 16:02:42

标签: php performance

假设我正在创建一个会话类,其相关实现如下:

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

如果会话已登录,则$user字段包含User类型的对象,如果会话未登录到站点,则为null。 $id是会话ID。

假设我现在想知道用户是否已登录。显然我可以查看$ user是否为null,如果是则用户未登录 - 如下所示:

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 个答案:

答案 0 :(得分:10)

在此用户提供的帖子(link to post)上检查php.net基准,我们发现=====is_null快得多。

答案 1 :(得分:6)

越简单越好。如果引入一个新变量来跟踪$ user是否为null,那么您还会引入is_null($ user)和$ loggedIn不匹配的可能性。避免担心这一点的麻烦比任何可能的性能微观优化都要值得多。

答案 2 :(得分:3)

我想说最好的办法是:

return ($user !== null)

答案 3 :(得分:1)

最快的方法是isset()

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

如果变量设置(存在)且不是isset(),则TRUE函数返回NULL,否则返回FALSE

它比!is_null()!empty()快得多,并且比!== NULL略快,当值为NULL时,以及它不是{{1}时}}

答案 4 :(得分:0)

您实际上可以使用cast to bool解决问题:

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

PHP中的每个对象都是TRUE,而NULLFALSE

你原来的问题"什么是更快"通常不起任何重要作用。更重要的是,您可以轻松阅读您的代码,其中包括不编写不必要的代码,尤其不是,因为您猜测月亮处于特定阶段时可能会更快。

你不知道两件重要的事情:我的代码太慢了吗?哪一个更快?如果你根本无法回答第一个问题,那么就不要考虑问第二个问题。

你只是在脑中放入一些你永远不会使用的东西。那是a common mistake inexperienced programmers do,所以越早停下来,你就越快获得可以使用的结果。从一开始就保持代码越容易,就越容易运行。而那些你遇到的问题对你来说不会成为问题,因为没有太多的改变来消除性能损失。听起来很公平吗?