【问题标题】:Strange use of class's variable (micro optimization ?)类变量的奇怪使用(微优化?)
【发布时间】:2017-04-13 08:59:13
【问题描述】:

我是 PHP 新手,遇到了我认为奇怪的类变量用法(我使用 PHP 5.6,如果有帮助,我想使用 7.0)。

Class Foo {

    private $bar = 'some string not returned nor modified and used in one place';

    public function Test($foobar)
    {
        if ($foobar === $this->bar) {
            // Some code
        } else {
            // Some code
        }
    }
}

当我看到上面的代码时,我问我的同事为什么将 $bar 声明为类变量,为什么不只在方法“Test”中声明 $bar。 他回答说,在 Test 中声明 $bar 会导致性能损失,因为每次调用方法“Test”时,都会为 $bar 变量重新创建内存空间。

我有点疑惑,这是真的吗?我理解逻辑:如果您将变量声明为类变量,内存将被“分配”一次,而不是在每次调用时,但令我惊讶的是,php 在幕后没有自动优化来做到这一点。

这是旧的优化吗?将尽可能多的变量声明为类变量是一件好事吗?

很抱歉问了这样一个问题,但我搜索了一下,但一无所获(主要是因为我不知道必须输入哪个关键字才能获取有关此特定主题的信息)。

【问题讨论】:

  • $bar 是实例变量而不是(静态)类变量;并且应该被引用为$this->bar,而不是$self::bar....如果$bar是静态的,那么它将是self::$bar,而不是$self::bar
  • 我更正了,谢谢。
  • 如果字符串和你的例子一样简单,我会说这是一个微优化,性能提升可以忽略不计,这实际上使代码更难阅读。
  • 就我而言,它实际上只是一个字符串,但我的问题适用于其他变量类型(对象、数组...)。如果这是一个真正的优化,那么值得将尽可能多的局部变量的方法放在类变量上。
  • 虽然内存分配/释放可能会节省一点;与局部变量相比,访问实例属性也有轻微的性能开销......这是一个微优化

标签: php


【解决方案1】:

这是我在计算机上使用 PHP 7.0 完成的快速而肮脏的基准测试。我创建了三个类:

class Foo
{
    private $bar = 'some string not returned nor modified and used in one place';
    public function test($foobar)
    {
        if ($foobar === $this->bar) {}
    }
}

class Bar
{
    public function test($foobar)
    {
        $bar =  'some string not returned nor modified and used in one place';
        if ($foobar === $bar) {}
    }
}

class Baz
{
    public function test($foobar)
    {
        if ($foobar === 'some string not returned nor modified and used in one place') {}
    }
}

然后运行类似:

$a = microtime(true);
for ($i=0; $i<10000000; $i++) {
    (new Foo)->test('pop');
}
echo microtime(true) - $a . "\n";

我在每个课程上运行了 10 次,我得到的是 Bar and Baz 似乎每次都更快

所以这和你同事说的完全相反。

这是一个示例结果:

1.3472490310669 # foo
1.1803860664368 # bar
1.0683979988098 # baz

也就是说,两个字:

  • 我的基准很脏,不能证明任何事情。
  • 我通常不关心这种优化(但我认为您已经意识到微优化的争论)

【讨论】:

  • 其他问题可能是内存使用情况,但仍然 - 如果您的测试结果可靠,那么它肯定会反驳“同事”性能损失的说法。
  • 发布您的基准测试结果。数字清楚地表明这是一个微优化。
  • 你应该添加一个静态的乐趣。我想这就是你如何获得任何优化
  • 我添加了一个示例结果。仍然不是很可靠,但是他们的基准呢?它们更可靠吗?
  • 正如我所担心的,当涉及到这类事情时,没有一个真实而明确的答案。我们进行了相同的基准测试,结果大致相同(除了它需要我们两倍的时间)。我们选择在我们的程序中做“酒吧”的例子。谢谢。
猜你喜欢
  • 2012-07-10
  • 2015-05-08
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多