PHP中最昂贵的操作?

时间:2009-12-24 19:23:30

标签: php performance

PHP中最昂贵的操作有哪些?我知道过度使用@运算符的事情可能很昂贵。你还会考虑什么?

10 个答案:

答案 0 :(得分:19)

  • serialize()很慢,eval(),create_function()也很慢,并通过system()和相关函数生成其他进程。
  • 注意APC无法缓存的任何内容 - conditional includes,eval()ed代码等。
  • 打开数据库连接。始终缓存您的连接并重新使用它们。
  • 对象克隆
  • 正则表达式。如果您不需要正则表达式的功能,请始终对正则表达式操作使用常规字符串操作,例如尽可能使用str_replace()而不是preg_replace()
  • 记录和磁盘写入速度很慢 - 消除不必要的日志记录和文件操作

一些微观优化是很好的做法,但不会对您的底线表现产生太大影响:

  • 使用echo比打印更快
  • 连接变量比在双引号字符串中使用它们更快。
  • 将echo与参数列表一起使用比连接参数更快。示例:echo 'How are you ',$name,' I am fine ',$var1echo 'How are you '.$name.' I am fine '.$var1
  • 开启通知和警告。确保它们不会被触发,从而使PHP不必对它们运行错误控制。

答案 1 :(得分:5)

不要试图找出速度较慢的潜在区域,而是使用分析工具。安装xDebug可能是我为改进我编写的代码所做的最简单和最好的事情之一。使用WinCacheGrind(或适用于您的操作系统的正确版本)安装,以获得最佳效果。

答案 2 :(得分:4)

 "Hello $name"

语法慢于

'Hello ' . $name

__get() __set() __call()等也很慢

并且,如果您非常在意,可以使用SPL中的优化structures

答案 3 :(得分:2)

通过网络连接进行的任何事情 - 例如调用web服务:它通常比在本地执行操作需要更多时间。

(即使它的CPU成本不高,也需要花费时间)

答案 4 :(得分:1)

我会说循环中的SQL查询。比如这个:

foreach ($db->query('SELECT * FROM categories') as $cat)
{
    foreach ($db->query('SELECT * FROM items WHERE cat_id = ' . $cat['cat_id']) as $item)
    {
    }
}

对于记录,可以缩短为以下内容:

$sql = 'SELECT c.*, i.*
          FROM categoriess c
     LEFT JOIN items i USING (cat_id)
      ORDER BY c.cat_order';

foreach ($db->query($sql) as $row)
{
}

答案 5 :(得分:1)

与典型操作相比,

curl_exec()非常慢。此外,大多数str_ *操作比正则表达式操作更快。

答案 6 :(得分:1)

  • json_encode比序列化更快
  • 循环中的连接比内爆更快

人们认为@很昂贵,可能只是因为这句话在网上广泛传播。

引自:http://www.php.net/manual/en/language.operators.errorcontrol.php#102543

  

如果您想知道使用@对性能有何影响   运营商是,考虑这个例子。这里,第二个脚本(使用   @运算符执行时需要1.75倍...几乎加倍   第一个脚本的时间。

     

所以虽然是,但每次迭代都有一些开销,我们看到@   运营商每次呼叫仅添加.005毫秒。没有理由,imho,to   避免使用@运算符。

           

真正的0m7.617s用户0m6.788s sys 0m0.792s

     

vs

            

真0m13.333s用户0m12.437s sys 0m0.836s

你几乎无法“过度使用”操作员,如果它正在进行你想要的操作,它通常是值得的。

答案 7 :(得分:0)

foreach()语句,尤其是嵌套语句,通常很昂贵;虽然这是我的天真 - 偶尔计划不好 - 编程的方法,因为php的错误。

虽然我认为JS和其他语言也是如此,但几乎可以肯定是我的错。 = /

答案 8 :(得分:0)

根据我自己的经验,实际上最昂贵的操作是echo声明。尝试将所有字符串连接在一起,然后将它们输出到浏览器,然后是数据库调用,特别是连接!

只需简单地重构算法和数据结构,代码有时也可以提高x10的性能。得到任何程序,尝试一半的长度,你能再次减半吗?

答案 9 :(得分:0)

uniqid()是愚蠢的代价。不要用来生成许多唯一标识符。