2016-09-26 29 views
2

シナリオ: - APCuを使用している少数のPHPプロジェクト(ウェブサイトなど)。それぞれは、一意のID /ハッシュによって識別される。 20文字です。我々はこれを$site_hashと呼ぶ。 - 各プロジェクトは、キーで識別されるAPCuに格納された多数の小さな値を格納します。ので、apcu_fetch()は、接頭辞または接尾辞の方が高速ですか?

$value = apcu_fetch($key . '|' . $site_hash); 

一つは、二番目が高速であることを考えることができます:

通常1は、このようにキャッシュキーを使用してエントリを区別します:

$value = apcu_fetch($site_hash . '|' . $key); 

しかし、一つには、代わりにこれを行う可能性がありますこのように、ハッシュテーブルルックアップは、しばしば最初の数文字を見るだけでよい。

誰かがこの仮説を確認できますか?

(私はこの実験を自分で実行することができます確信している。私が行う場合、私はここでそれを共有することになります。)

+1

あなたは間違っていません。一方、文字通りここではミリ秒単位で話しています。あなたが本当に何かをやっているのでなければ、正直に言って、どちらをやるか。 – Andrew

+0

これは1回のリクエストにつき300回と言われることでしょう。クラスローダー用のキャッシュ。だから2ミリ秒を節約できるなら、私はそうするでしょう。 – donquixote

+0

十分に公正。 @LeCintasは良い点を作っています。どのようにそれらのキーを置いても、それらの値をどのように置いても、平均ルックアップ時間はO(n)になります。 – Andrew

答えて

0

関数は、ハッシュテーブルを使用している場合でも、あなたの方法の両方が、他のものよりも高速になります。私は説明します:

$ site_hashが$ keyの前に使用されている場合、速度は最初の文字のASCII値に依存します(文字列が 'z'で始まる場合は、 'a ')。

$ keyで始まると同じ問題になります。

+0

質問は平均検索時間になります。もし私が300の鍵を見たら、それは超高速です。 – donquixote

0

ベンチマークを実行しました。

<?php 

function apcutest($prepend = FALSE) { 

    apcu_clear_cache(); 

    $prefix = $suffix = __FILE__ . __FILE__ . __FILE__; 

    $keys = []; 
    for ($i = 0; $i < 100000; ++$i) { 
    apcu_store(
     $keys[] = $prepend 
     ? $prefix . $i 
     : $i . $suffix, 
     md5("($i)")); 
    } 

    $t0 = microtime(TRUE); 

    foreach ($keys as $key) { 

    apcu_fetch($key); 
    apcu_fetch($key); 
    apcu_fetch($key); 
    apcu_fetch($key); 
    apcu_fetch($key); 

    apcu_fetch($key); 
    apcu_fetch($key); 
    apcu_fetch($key); 
    apcu_fetch($key); 
    apcu_fetch($key); 
    } 

    $t1 = microtime(TRUE); 

    return ($t1 - $t0) * 1000; 
} 

$dts = []; 
$dts[] = apcutest(FALSE); 
$dts[] = apcutest(TRUE); 
$dts[] = apcutest(FALSE); 
$dts[] = apcutest(TRUE); 
$dts[] = apcutest(FALSE); 
$dts[] = apcutest(TRUE); 

print_r($dts); 

私のマシン上の結果:

Array 
(
    [0] => 415.98796844482 
    [1] => 413.39302062988 
    [2] => 414.03603553772 
    [3] => 415.08793830872 
    [4] => 413.25092315674 
    [5] => 414.61896896362 
) 

観察:そこにいくつかのランの は接尾辞を持つバージョンのために非常に小さいが一貫有利であるように思われました。 しかし、その後の実行ではこれが確認されませんでした。 この実験では、両者の間に統計的に有意な差はありません。

結論: この実験に基づいて、接頭辞または接尾辞を使用するかどうかは関係ありません。 これは最終的な答えではないかもしれませんが、私がこの時点で与えることができるのは答えです。 このルックアップがどのように実装されているのだろうか。

関連する問題