【问题标题】:Why is this code so quick?为什么这段代码这么快?
【发布时间】:2011-05-27 13:08:43
【问题描述】:

编辑:这是因为我的代码中的错误(可能),在调试并在我的测试中添加检查正确响应之后,测试证明没有区别(这让我有点恼火),更多在下面我自己的答案中。
/EDIT

你好,

我已经为 PHP 的 SASS 编写了一个小 CSS 包装器,并将其编程为在运行我的 SASS 文件之前接受文件名和可能的标志(并且可能缓存,如果没有以其他方式标记)。

我还进行了一些测试和版本 nr。 2 大约比版本 nr 慢 2x - 4x1,尽管版本 1 必须运行比版本 2 更多的代码(它确实直接从磁盘包含,而不是先解析 URL 以获取标志) .

我不明白为什么真的和测试有点太一致而不能在磁盘访问开销上调用它。

这里是速度测试:

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

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

带有 readfile 而不是 require
的版本 版本 1 运行 1:总计:7.915 平均:7.915 毫秒/文件优先:2.49 毫秒
版本 2 运行 1:总计:9.508 平均:9.508 毫秒/文件优先:3.23 毫秒
版本 1 运行 2:总计:1:17.137 平均:7.714 毫秒/文件优先:4.61 毫秒
版本 2 运行 2:总计:1:15.717 平均:7.572 毫秒/文件优先:2.69 毫秒 * - 运行 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 秒,所以这可能只是随机磁盘使用)

【问题讨论】:

  • 如果用 readfile 替换 require 会发生什么? Require 必须将缓存文件解析为 PHP 脚本,这可能不是您想要的。
  • Emil:谢谢,这带来了一点加速,使两个版本的速度几乎相同,但我仍然不明白为什么需要版本 1 更快。
  • 如果这段代码没有实现条件get,那只是浪费时间
  • 计划中的下一个 :)

标签: php performance require file-exists


【解决方案1】:

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

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

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

【讨论】:

  • 那只是放错了数字-由于测试顺序相反-我用test2.php测试版本1,用test1.php测试版本2,只是我的一个错误
【解决方案2】:

好像有问题

  if (file_exists('cache/'.($cachefile=basename('/',$_GET['f']))))

要么

  • 有一个类型,想改用explode
  • basename 未按应有的方式使用 - 即 basename($_GET['f']) 而不是 basename('/', $_GET['f'])

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

【讨论】:

  • 我想可能就是这样!但是,似乎唯一的结果是,它删除了使用readfile 对抗require 获得的任何减速带,所以我正在用实际响应进行更多测试。
【解决方案3】:

所以,主要区别在于我的代码中的错误,ring0 指出了(谢谢)。

修复错误后,编辑测试以在 n 次迭代中的每个 (n/10) 个案例中显示响应并并行运行两个测试,结果如下:

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

版本 1 的结果(带有 读取文件):
处理 10000
花了 4:35.242 [1292677437-1292677712]
平均 时间:27.524 毫秒

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

版本 2 的结果(带有 读取文件):
处理 10000
花了 4:32.336 [1292677433-1292677706]
平均 时间:27.234 毫秒

图表:

因此,新版本/版本 2(即 require/readfile 位于顶部的版本)现在更快了,尽管没有那么显着。我可能会使用它以及 readfile 增强功能(感谢Emil)。

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

这就是发生的事情

【讨论】:

    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多