PHP功能效率

时间:2009-06-28 22:01:35

标签: php performance optimization

是否有一个表格显示在PHP中执行给定函数需要多少“工作”?我不是一个compsci专业,所以我可能没有正式的背景知道“哦是的,字符串需要更长的时间来工作而不是整数”或类似的东西。程序中的所有步骤/行都是相同的吗?我甚至不知道从哪里开始研究这个。

我目前正在做一些项目Euler问题,我非常确定我的答案是可行的,但我会在一分钟内按照我的要求超时我的本地Apache服务器(并且PE已经说过所有问题都可以解决< 1分钟)。我不知道如何/从哪里开始优化,因此了解更多关于PHP及其如何使用内存将是有用的。对于它的价值,这是我的question 206代码:

<?php
$start = time();
for ($i=1010374999; $i < 1421374999; $i++) { 
$a = number_format(pow($i,2),0,".","");
$c = preg_split('//', $a, -1, PREG_SPLIT_NO_EMPTY);
if ($c[0]==1) {
    if ($c[2]==2) {
        if ($c[4]==3) {
            if ($c[6]==4) {
                if ($c[8]==5) {
                    if ($c[10]==6) {
                        if ($c[12]==7) {
                            if ($c[14]==8) {
                                if ($c[16]==9) {
                                    if ($c[18]==0) {
                                        echo $i;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
}
$end = time();
$elapsed = ($end-$start);
echo "<br />The time to calculate was $elapsed seconds";
?>

如果这是关于优化的维基问题,请告诉我,我会移动它。再一次,没有寻找答案,只是帮助我在哪里学习如何有效地编写代码(虽然粗略的提示不会被拒绝,我意识到可能有更优雅的数学方法来设置问题)

5 个答案:

答案 0 :(得分:6)

没有这样的表可以告诉你每个PHP函数执行需要多长时间,因为执行的时间会根据输入的不同而变化很大。

看看你的代码在做什么。你已经创建了一个将运行411,000,000次的循环。鉴于代码需要在不到60秒(一分钟)内完成,为了解决问题,您假设每次循环中的行程将花费少于(大约).000000145秒。这是不合理的,没有多少使用“正确”功能将解决您的电话。尝试使用

中的循环
for ($i=1010374999; $i < 1421374999; $i++) { 

}

除非您可以访问科幻小说计算机,否则这可能不会在60秒内完成执行。所以你知道这种方法永远不会奏效。

这是一个解决问题的蛮力解决方案。 Project Euler的目的是让你从数学和编程的角度创造性地思考问题。您希望减少您需要通过该循环的行程次数。显而易见的解决方案永远不会成为答案。

我不想告诉你解决方案,因为这些事情的重点是通过它来思考并成为更好的算法程序员。检查问题,考虑它的限制,并考虑减少需要检查的数字总数的方法。

答案 1 :(得分:2)

查看代码执行时间的好工具是xDebug:http://xdebug.org/docs/profiler

这是一个可安装的PHP扩展,可以配置为输出脚本的函数调用和执行时间的完整细分。使用它,您将能够看到代码中执行时间最长的内容并尝试使用不同的方法。

编辑:现在我正在查看你的代码,你正在运行4亿+正则表达式调用!我对Euler项目一无所知,但我很难相信这些代码可以在一分钟内在商品硬件上得到解决。

答案 2 :(得分:1)

preg_split可能会很慢,因为它正在使用正则表达式。有没有更好的方法来做这条线?

提示:您可以像这样访问字符串中的字符:

$str = 'This is a test.';
echo $str[0];

答案 3 :(得分:0)

尝试将preg_split()切换为更快的explode()str_split()

答案 4 :(得分:0)

首先,这是一个稍微更简洁的函数版本,带有调试输出

<?php
$start = time();
$min = (int)floor(sqrt(1020304050607080900));
$max = (int)ceil(sqrt(1929394959697989990));

for ($i=$min; $i < $max; $i++) {
$c = $i * $i;
echo $i, ' => ', $c, "\n";
if ($c[0]==1
    && $c[2]==2
        && $c[4]==3
        && $c[6]==4
        && $c[8]==5
        && $c[10]==6
        && $c[12]==7
        && $c[14]==8
        && $c[16]==9
        && $c[18]==0)
  {
    echo $i;
        break;
  }
}
$end = time();
$elapsed = ($end-$start);
echo "<br />The time to calculate was $elapsed seconds";

这是前10行输出:

1010101010 => 1020304050403020100
1010101011 => 1020304052423222121
1010101012 => 1020304054443424144
1010101013 => 1020304056463626169
1010101014 => 1020304058483828196
1010101015 => 1020304060504030225
1010101016 => 1020304062524232256
1010101017 => 1020304064544434289
1010101018 => 1020304066564636324
1010101019 => 1020304068584838361

那就在那里,似乎它可以激发你的算法的可能优化。请注意,从第6个条目(1020304060504030225)开始,我们甚至没有接近 - 我们在需要5的位置上有6个!

事实上,接下来的许多参赛作品将毫无价值,直到我们回到我们在该位置有5的位置。为什么要费心计算干预价值呢?如果我们可以弄清楚如何,我们应该跳到1010101060,那里的数字再次变为5 ......如果我们可以在这样的时间内继续跳过几十次迭代,我们将节省超过90%的运行时间!

请注意,这可能根本不是一种实用的方法(实际上,我相信它不是),但这是你应该思考的方式。您可以使用哪些数学技巧来减少执行的迭代次数?

相关问题