【问题标题】:Static variable for optimization用于优化的静态变量
【发布时间】:2011-01-29 05:40:00
【问题描述】:

我想知道是否可以使用静态变量进行优化:

public function Bar() {
    static $i = moderatelyExpensiveFunctionCall();
    if ($i) {
        return something();
    } else {
        return somethingElse();
    }
}

我知道一旦$i 被初始化,它不会被那行代码在连续调用Bar() 时改变。我假设这意味着moderatelyExpensiveFunctionCall() 不会在我每次调用时都被评估,但我想确定一下。

一旦 PHP 看到一个已初始化的静态变量,它会跳过那行代码吗?换句话说,如果我对Bar() 进行大量调用,这是否会优化我的执行时间,还是我在浪费时间?

【问题讨论】:

  • 为什么不试试呢?这是一个非常简单的改变。

标签: php optimization static-variables


【解决方案1】:

我发现执行以下代码更容易。这样,缓存是全局完成的,而不是每个函数的实现。

function moderatelyExpensiveFunctionCall()
{
   static $output = NULL;
   if( is_null( $output ) ) {
     //set $output
   }
   return $output;
}

【讨论】:

  • 好电话。这就是真正的问题所在。这是一段较旧的代码,可能会使用优化检查。
  • 一个附带问题:不使用许多(本地)静态变量,特定于单个函数会导致 RAM 开销(因为它们将保存在内存中直到脚本完全执行)或者都是变量保存在 PHP 中的内存中?
  • @ColorWP.com 是的,这基本上定义了内存泄漏,但这就是重点。这类似于单例模式。
【解决方案2】:

static $i = blah() 不会编译,因为 php 不允许在静态初始化程序中使用表达式和函数调用。你需要类似的东西

function foo() {
   static $cache = null;

   if(is_null($cache)) $cache = expensive_func();

   do something with $cache
}

【讨论】:

    【解决方案3】:

    这应该适用于您(非常简单)的情况:

    function your_function() {
        static $output;
    
        if (!isset($output)) {
           $output = 'A very expensive operation';
        }
    
        return $output;
    }
    

    关于全局缓存机制,可以使用类似于this one的方法。

    【讨论】:

      【解决方案4】:

      这是一个相当短的方法:

      function stuff()
      {
          static $smthg = []; // or null, or false, or something else
          if ($smthg) {
              return $smthg;
          }
      
          // filling $smthg goes here 
          // with a lot of 
          // code strings
      
          return $smthg;
      }
      

      【讨论】:

        【解决方案5】:

        怎么样:

        if (!isset($i))
        {
            static $i = moderatelyExpensiveFunctionCall();
        }
        

        【讨论】:

        • 我对此进行了测试。 isset() 似乎总是返回 false。
        • $i 在此之前永远不会被设置,所以条件永远不会执行
        猜你喜欢
        • 2011-09-07
        • 1970-01-01
        • 2011-04-19
        • 2017-05-13
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        相关资源
        最近更新 更多