【问题标题】:PHP Function execution cost tablePHP函数执行成本表
【发布时间】:2009-07-24 12:11:43
【问题描述】:

有一个参考表显示每个php函数的执行成本?

我知道时间执行受很多因素的限制,不可能确定一个唯一值,但我正在寻找一个“意识形态”表。

例如,

is_dir() = cost 3
is_file() = cost 2

(以它为例;)

如果我不记得不好,对于 C 来说,有一个表,其中包含每个操作所需的 cpu 周期..

编辑:我阅读了你所有的评论,所以有任何表格可以满足我的需要。

反正我知道

is_dir('/');//is faster than
is_dir('/a/very/long/path/to/check/');

但是,我很难接受这种情况(如果我理解你的话,是可能的);

$a = '/';
$b = '/a/very/long/path/to/check/';
is_dir($a);  //time execution 0.003
is_file($a); //time execution 0.005
//so suppose is_dir is faster than is_file
//(still example, function names and number are random ;)
is_dir($b);  //time execution 0.013
is_file($b); //time execution 0.009
//wow, now is faster is_file()....?

【问题讨论】:

    标签: php execution-time micro-optimization


    【解决方案1】:

    这样的图表不会有帮助或不准确。在您的示例中,函数的时间安排在很大程度上取决于本地文件系统的细节,并且很快就会变得毫无意义。

    衡量性能的唯一真正方法是构建代码,然后对其计时。是不是比一会儿快?也许在一种情况下一个会比另一个更好,而在另一种情况下另一个会更快,这取决于特定于其中代码的各种因素。

    使用分析器为您的代码计时,并获取一些对您的服务器环境中的项目准确的有意义的数据。

    【讨论】:

    • 所以你确认了我在评论中对安德鲁回答所说的情况。
    • 即使 is_file() 比 is_dir() 快了 80%,但说它更快仍然没有意义,因为它只是在某些情况下有时更快。另一段代码可能会遇到 100% 的情况下速度较慢的情况。关键是图表会给你一种错误的感觉,什么是更快,什么是慢。唯一真正的答案是衡量您特定情况下的性能并从那里开始。
    • 我想补充一点,is_file()is_dir() 不同。您不会根据需要多长时间来选择使用哪个功能,而是取决于您需要做什么。很少有两个函数做完全相同的事情并且可以互换,所以这些问题只对在相同输入的情况下两个函数产生相同输出的少数情况才有意义。这是非常具体的,但很难一概而论。
    • 是的,我知道 is_dir 和 is_file 之间的区别,这两个是我想到的第一个函数;)
    【解决方案2】:

    我不知道有这样的表。

    函数的成本会因输入而有很大差异。

    由 array_unique() 处理的 1000 项数组将比具有 5 项输入数组的相同函数花费更长的时间。

    如果您有兴趣调整您的应用程序,您可以使用微时间来计时每个函数调用的执行。

    看起来像这样

    $starttime = microtime();
    is_dir('/var/foo');
    $stoptime = microtime();
    echo "is_dir cost: ".($stoptime-$startime);
    

    【讨论】:

    • 我没有考虑输入..所以,例如,我能找到is_dir($a)比is_file($a)快,但is_dir($b)比id_file慢的情况($b)? p.s: is_dir 和 is_file 是我脑海中最先浮现的两个函数,但这只是一个例子
    【解决方案3】:

    我认为这样的表无论如何都不可能存在。

    首先,时间很大程度上取决于输入。但是对于各种功能来说,这不是一个这样的问题。我们可以指出算法复杂度:O(n^2)、O(n log(n)) 等等。我们有很好的数学工具来处理这种事情。

    更重要的是环境。您无法预测功能会工作多长时间,因为您不了解所有环境。 NFS 卷上的 file_exists() 不会像本地 ext3 卷上那么快。您无法预测请求将多长时间传输到 MySQL 服务器等等。

    所以你应该做的是测量、测量和测量。仅取决于您自己的测量结果和您的环境。这是唯一的方法。

    【讨论】:

      【解决方案4】:

      你不能像 PHP 那样“指令计数”。即使使用 C,它也将取决于 libc 实现。

      【讨论】:

      • 我不知道该怎么做,但似乎很奇怪,不存在类似的东西..我的意思是,for() 循环或 while() 更快?这种比较会很棒恕我直言
      • for() 与 while() 取决于编译器(与 libc 无关)以及优化选项和架构。在实践中,它们将生成相同的本机代码。
      【解决方案5】:

      我不认为有函数成本表之类的东西,因为同一个函数可能有非常不同的成本,具体取决于上下文。

      例如(但仅以它为例!):

      is_dir('/'); //will be very fast
      is_dir('/symbolic_link/symbolic_link_on_a_remote_fs/'); //will be way slower
      

      话虽如此,评估函数调用成本可能是一种非常好的优化方法。

      使用分析器可以帮助您意识到代码中的某些特定函数调用比您希望的要慢,重新思考/重写这些部分可以大大加快速度。

      【讨论】:

        【解决方案6】:

        您将获得的最接近的可能是通过 Vulcan Logic Dumper (author's webpage/project homepage link)(过去称为 Vulcan Logic Disassembler (PECL link))进行的 OpCode 分析。 Sarah Golemon 在her blog 上有一些关于这些东西的好信息。

        【讨论】:

          【解决方案7】:

          使用 register_tick_function 并声明(ticks=1) 这些自 PHP4 以来就已经存在,并提供低级指令计数。我想这是通过计算 PHP 操作码的解释和执行过程中生成的指令来实现的。

          【讨论】:

            猜你喜欢
            • 2018-02-04
            • 2018-08-29
            • 2014-09-09
            • 1970-01-01
            • 1970-01-01
            • 2016-04-11
            • 2011-07-18
            • 2013-02-03
            • 1970-01-01
            相关资源
            最近更新 更多