为什么这段代码如此之快?

时间:2010-12-18 11:52:09

标签: php performance require file-exists

编辑:这是因为我的代码中的错误(可能),经过调试并在我的测试中添加了对正确响应的检查,测试证明没有区别(什么让我感到烦恼),更多在我自己的答案中 / EDIT

您好,

我为自己编写了一个用于PHP的SASS的CSS包装程序,并将其编程为在运行之前接受文件名和可能的标志(如果没有标记,可能还有缓存)我的SASS文件。

我也进行了一些测试和版本nr。 2 2x - 4x 比版本nr慢的东西。 1 ,虽然版本 1 必须运行更多代码,然后版本 2 (它直接包含在磁盘中,而不是首先解析URL的标记)

我不明白为什么真的和测试有点过于一致,无法在磁盘访问开销上调用它。

以下是速度测试:

  

首先 - 生成文件,然后 - 只需要来自缓存
  版本1总计: 10.886 平均值: 10.886 ms /文件首先: 466.42 ms
  版本2总计: 21.235 平均值: 21.235 ms /文件优先: 14.54 ms

     

只需要缓存
  版本1总计: 7.886 平均值: 7.886 ms /文件优先: 2.93 ms
  版本2总计: 21.657 平均值: 21.657 ms /文件优先: 6.98 ms

     

带有readfile而不是require的版本   版本1运行1:总计: 7.915 平均值: 7.915 ms /文件优先: 2.49 ms
  版本2运行1:总计: 9.508 平均: 9.508 ms /文件首先: 3.23 ms
  版本1运行2:总计: 1:17.137 平均值: 7.714 ms /文件优先: 4.61 ms
  版本2运行2:总计: 1:15.717 平均值: 7.572 ms /文件首先: 2.69 ms   * - 第2次运行 10,000 来电。

版本1

/* HELPER FUNCTIONS */
function is_option($opt) { global $url_options; return in_array($opt,$url_options); }
function fail($message) { echo $message; die(); }

//prepare options array
$options=array();

$url_options = @explode('_',basename($_GET['f']));
if (!is_array($url_options))
    { fail('Wrong parameters given (or parameter can\'t be accepted)'); }
$loadfile = array_shift($url_options);

if (!file_exists('source/'.$loadfile.'.sass'))
{
    if (!file_exists('source/'.$loadfile.'.scss'))
        fail('Wrong parameters given (file doesn\'t exist)');
    else
        $options['property_syntax']='scss';
}else{
    $options['property_syntax']='sass';
}

$src_file = 'source/'.$loadfile.'.'.$options['property_syntax'];
$css_file = 'cache/'.$loadfile.'.css';

if (file_exists($css_file) && !is_option('no-cache'))
{
    header('content-type: text/css');
    require($css_file);
    die(); //ALL OK, loaded from cache
}

第2版

//quick! load from cache if exists!
if (file_exists('cache/'.($cachefile=basename('/',$_GET['f']))))
{
    header('content-type: text/css');
    require('cache/'.$cachefile);
    die(); //ALL OK, loaded from cache
}

/* HELPER FUNCTIONS */
function is_option($opt) { global $url_options; return in_array($opt,$url_options); }
function fail($message) { echo $message; die(); }

//prepare options array
$options=array();

$url_options = @explode('_',basename($cachefile));
if (!is_array($url_options))
    { fail('Wrong parameters given (or parameter can\'t be accepted)'); }
$loadfile = array_shift($url_options);

if (!file_exists('source/'.$loadfile.'.sass'))
{
    if (!file_exists('source/'.$loadfile.'.scss'))
        fail('Wrong parameters given (file doesn\'t exist)');
    else
        $options['property_syntax']='scss';
}else{
    $options['property_syntax']='sass';
}

$src_file = 'source/'.$loadfile.'.'.$options['property_syntax'];
$css_file = 'cache/'.$loadfile.'.css';

我可能会使用版本1,我只是想了解为什么v2确实较慢,尽管它运行的代码较少...

编辑:似乎readfilerequire快一点,两个版本在统计上相同,但版本 1 仍然更快(但1000和10000次呼叫只有2秒,所以这可能只是随机磁盘使用)

3 个答案:

答案 0 :(得分:1)

你是什么意思,“版本2必须运行更多代码”?

版本2首先检查缓存,如果找到缓存文件则跳过所有其余缓存。

当然,它也完全忽略了所有“网址选项”。

答案 1 :(得分:1)

似乎

中存在错误
  if (file_exists('cache/'.($cachefile=basename('/',$_GET['f']))))

或者

  • 有一个类型,而explode想要使用
  • basename未按原样使用 - 即basename($_GET['f'])代替basename('/', $_GET['f'])

因此$cachefile为空,if始终为 true require适用于cache目录。

答案 2 :(得分:1)

因此,主要区别在于我的代码中的错误,由ring0指出(谢谢)。

修复错误后,编辑测试以在 n 迭代中的每个(n / 10)情况下显示响应并同时运行两个测试,结果是这些:

  

版本1的结果(带有   需要):
  处理    10000 次    4:56.806   [ 1292676882 - 1292677179 ]
平均   时间: 29.681 毫秒

     

版本1的结果(带有   ReadFile的):
  处理    10000 次    4:35.242   [ 1292677437 - 1292677712 ]
平均   时间: 27.524 毫秒

     

版本2的结果(带有   需要):
  处理    10000 次    4:55.760   [ 1292676879 - 1292677175 ]
平均   时间: 29.576   毫秒

     

版本2的结果(带有   ReadFile的):
  处理    10000 次    4:32.336   [ 1292677433 - 1292677706 ]
平均   时间: 27.234 毫秒

<强>图形:
Speeds for 10,000 iteration calls

因此,新版本/版本2(其中,需求/读取文件位于顶部的那个)现在更快,尽管不是那么显着。我可能会使用那个,以及readfile增强(感谢Emil)。

谢谢大家,如果你没有正确测试会发生这种情况:)

这就是发生的事情