【问题标题】:Best way to optimize the following PHP code? [closed]优化以下 PHP 代码的最佳方法是什么? [关闭]
【发布时间】:2012-09-01 18:28:36
【问题描述】:

我是 php 的新手。你能告诉我优化这个 php 代码以获得最佳性能的最佳方法是什么吗:

 $data = mysql_query("SELECT * FROM wcddl_recents ORDER BY id DESC LIMIT 15");
$searchai = mysql_fetch_array( $data );
while($searchai = mysql_fetch_array($data)) {
$searchai[query] = strip_tags($searchai[query]);
    $searchai_clean = str_replace(array("/","\\","'",'"',"<",">","-","+","%","@","%20","(",")",":","[","]","{","}","?","!")," ",$searchai[query]);
    $searchai_cleandvigubai = str_replace(" ","-",$searchai_clean);
    $searchai_cleandvigubaix = str_replace(array("---","--"),"-",$searchai_cleandvigubai);
    $searchai_cleandvigubai2 = strtolower($searchai_cleandvigubaix);

【问题讨论】:

  • 个人资料。例如,使用 xdebug+cachegrind 来确定时间花费在哪里。
  • 专业提示:尝试为一个问题找到几种解决方案,并编写一个测试脚本,看看哪一个表现最好。你为自己做的测试可能更容易记住。
  • OP,您确定要优化吗?也许您只是想让代码不那么难看(这不一定与性能相关)?

标签: php regex optimization str-replace


【解决方案1】:

请务必注意优化俱乐部规则:

  1. 优化俱乐部的第一条规则是,你不要优化。
  2. 优化俱乐部的第二条规则是,你不优化而不测量
  3. 如果您的应用运行速度快于底层传输协议,则优化结束。
  4. 一次一个因素。
  5. 没有市场机器人,没有市场机器人时间表。
  6. 只要需要,测试就会继续进行。
  7. 如果这是您在优化俱乐部的第一晚,您必须编写一个测试用例。

你需要注意的两个大的是#2和#3。

首先,您是在不衡量的情况下进行优化。您还不知道该代码块的哪些部分花费的时间最多。为此,您需要一个工具来告诉您,例如 xdebug。如果做不到这一点,请在每个语句之后调用 PHP 的 microtime() 函数来计算每个语句的执行时间。

似乎提供的大多数答案都为您提供了加速字符串函数的方法,但我敢打赌,调用 SQL 函数和返回行所花费的时间会使这些函数的执行时间相形见绌字符串函数。例如,如果整个代码运行时间为 1000 毫秒,SQL 调用需要 970 毫秒,字符串函数需要 30 毫秒,那么即使将字符串函数的速度减半,也只能节省 15 毫秒。

假设 SQL 调用是瓶颈,看看你能做些什么来加速它们。 SQL 查询是否使用了它应该使用的索引? ID 列是否被索引?

您是否使用了正确的 PHP 函数?是否有一个mysql_* 函数将在一个批次中返回结果中的所有行,而不是访问数据库 15 次?就此而言,mysqli_pdo_ 函数集是否以某种方式更快? mysql_ 函数已正式弃用。 (请参阅big red box 并阅读替代方案。)

最后,你需要它跑多快?如果现在运行需要 10 秒,您希望它运行多快? 9秒够快吗?或者你需要它在 1 中运行吗?您甚至可能无法获得所需的加速。

tl;dr:尝试加速代码之前找出慢的部分。

【讨论】:

    【解决方案2】:

    这个怎么样?变量更少,您可以在第一条语句中使用 strtolower,并与 strip_tags 一起使用。

    您正在用空格替换几个字符,然后用破折号替换空格。还不如把两者结合起来。还要从干净的替换件上取下破折号。它被替换为一个空格,然后又是一个破折号,除非它是 Microsoft 双破折号,此时您可以在下面的示例中再次添加它。

    $searchai[query] = strtolower(strip_tags($searchai[query]));
    $searchai_clean  = str_replace(array("/","\\","'",'"',"<",">","+","%","@","%20","(",")",":","[","]","{","}","?","!"),"-",$searchai[query]);
    $searchai_cleandvigubaix = str_replace(array("---","--"),"-",$searchai_clean);
    

    【讨论】:

      【解决方案3】:

      不要优化它;分析它。

      使用诸如XDebug 之类的分析器工具来找出代码的哪些部分运行时间最长。一旦您知道代码的哪些部分花费的时间最多,您就可以专注于这些区域。

      加速这些特定代码领域的少量工作将比数月修补边缘产生更大的影响。

      事实上,除非您在一个流量很大的网站上工作并且需要节省每一个可能的带宽字节,否则所有那些在人们称为“优化”的边缘上进行的修补可能会产生几乎为零的可识别效果。

      简而言之:找出慢的;解决这个问题。其他的就不用管了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 2019-07-24
        • 2013-04-13
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多