3

編集:これは私のコードのバグが原因でした(おそらく)。デバッグしてテストで正しい応答のチェックを追加した後、テストで違いがないことを証明します(少しイライラします)。以下の私自身の回答で詳しく説明します。
/編集

こんにちは、

私は PHP 用の SASS 用の小さな CSS ラッパーを自分で作成し、SASS ファイルを実行する前にファイル名と可能なフラグを受け入れるようにプログラムしました (フラグが立てられていない場合は、おそらくキャッシュします)。

また、いくつかのテストとバージョン番号も実施しました。2は、バージョン番号よりも約2 倍から 4 倍遅くなります。1、ただし、バージョン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ミリ秒

バージョン
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 の方が正確に遅いのかを理解したいと思います...

編集:readfileよりも少し速いようでrequire、2 つのバージョンが統計的に同じになるように見えますが、バージョン1はまだ高速です (ただし、1000 回と 10000 回の呼び出しでわずか 2 秒なので、これはランダムなディスク使用量である可能性があります)。

4

3 に答える 3

1

にバグがあるようです

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

また

  • タイプがあり、explode代わりに使用したかった
  • または本来のbasename用途で使用されていない - つまりbasename($_GET['f'])、代わりにbasename('/', $_GET['f'])

したがって、$cachefileは空白で、ifは常にで、はディレクトリにrequire適用されcacheます。

于 2010-12-18T12:24:11.523 に答える
1

「バージョン 2 ではより多くのコードを実行する必要がある」とはどういう意味ですか?

バージョン 2 は最初にキャッシュをチェックし、キャッシュされたファイルが見つかった場合は残りをすべてスキップします。

もちろん、すべての「URL オプション」も完全に無視しています。

于 2010-12-18T12:03:52.373 に答える
1

したがって、主な違いは、 ring0によって指摘された私のコードのエラーによるものでした(ありがとう)。

バグを修復し、テストを編集して n 回の繰り返しのうち (n/10) 回目のケースごとに応答を表示し、両方テストを並行して実行した後、結果は次のようになります。

バージョン 1 (require あり) の結果: 10000
処理 4:56.806 [ 1292676882 - 1292677179 ]平均時間: 29.681ミリ秒

バージョン 1 の結果 (readfile あり): 10000
処理 4:35.242 [ 1292677437 - 1292677712 ]平均時間: 27.524ミリ秒

バージョン 2 (require あり) の結果: 10000
処理 4:55.760 [ 1292676879 - 1292677175 ]平均時間: 29.576 ミリ秒

バージョン 2 の結果 (readfile あり): 10000
処理 4:32.336 [ 1292677433 - 1292677706 ]平均時間: 27.234ミリ秒

グラフ:
10,000 回の反復呼び出しの速度

そのため、新しいバージョン/バージョン 2 (require/readfile が一番上にあるバージョン) は、それほど大きくはありませんが、現在は高速です。私はおそらくそれを readfile 拡張と一緒に使用します ( Emilに感謝します)。

ありがとうございます。適切にテストしないとこうなります :)

これが起こることです

于 2010-12-18T13:45:14.403 に答える