2017-01-14 12 views
0

のグローバル言語配列を最適化することができ、私は周りの3Kの行の1列$phrasesを保持している言語ファイルを持っています。はどのように私はPHP

$phrases = array(); 
$phrases['hello'] = 'bonjour'; 

この配列から値を取得する関数を作成しました。

次のように私が使用
function phrase($identifier) { 
    global $phrases; 
    return $phrases['identifier']; 
} 

function some_view() { 
    $intro = phrase('hello') . $firstname; 
} 

私は言語ファイルの成長に合わせて時間をかけて性能を保証するために、このコードを最適化するにはどうすればよいですか?

+3

も、非常に大きなデータ構造のために、効率的な滞在、あなたの悩みは何ですか? PHPでの配列アクセスはO(1)です。 – Gustek

+1

最適化するものは何ですか? Lookupは、サイズに関係なく常に高速になります。メモリを最適化する場合は、配列を別の「ドメイン」で分割して、不要な文字列を何千も読み込まないようにすることができます。少しずつあなたは 'gettext'と家族を多かれ少なかれ再実装するでしょう。 ;) – yivi

+0

SPLFixedArrayが気になる – hanshenrik

答えて

1

ペナルティはおそらく、コンパイル/実行時に評価されようとしています言語文字列検索操作中ではなく、それを最適化したいのであれば、あなたの言語の文字列を小さなセクションに分割し、必要に応じて各セクションをロードすることをお勧めします。

私はいくつかのテストを行いました。値を配列に代入するだけでは時間がかかりません。この関数は、ランダムな$キー値を生成し、連想配列$ key => $キーをいくつかの回数割り当てます。

function get_str() { 
    $retval = ""; 
    for($j=0; $j<10; $j++) { 
      $retval .= chr(mt_rand(ord("A"), ord("Z"))); 
    } 
    return $retval; 
} 

$arr = array(); 
$el1 = 0; 
for($i=0; $i<1000000; $i++) { 
    $key = get_str(); 
    $start = microtime(TRUE); 
    $arr[$key] = $key; 
    $el1 += (microtime(TRUE) - $start); 
} 
var_dump($el1); 

結果:

10 elements   1.1920928955078E-5 
100 elements  9.4175338745117E-5 
1,000 elements  0.00090622901916504 // less than a millisecond 
1,000,000 elements 1.0554702281952 

これは非常に重い罰ではありません。 I 1,000ルックアップを実行するためにいくつかのコードを追加:

$el2 = 0; 
for($i=0; $i<1000; $i++) { 
    $lookup = get_str(); 
    $start = microtime(TRUE); 
    $val = (isset($arr[$lookup]) ? $arr[$lookup] : ""); 
    $el2 += (microtime(TRUE) - $start); 
} 
var_dump($el2); 

Iが10〜1,000,000配列内の要素の数を変化させ、それぞれのアレイサイズに千のルックアップを行います。結果:

10 elements   0.00072717666625977 
100 elements  0.00070691108703613 
1000 elements  0.00071167945861816 // less than a millisecond 
1,000,000 elements 0.0008540153503418 // still less than a millisecond 

あなたが見ることができるように、連想ハッシュルックアップが

+1

うわー、素晴らしい返信! – bart

+0

解決策としてそれをマークしてください;) –

+0

これはちょっと解決策です。私の提案するコードではパフォーマンス上の問題はないことがわかります。ありがとう。 – bart

2

配列を使用したローカライゼーションは簡単で高速ですが、将来必要な機能(たとえば、日付書式、通貨または複数形を扱うなど)が不足しています。

はここで非常によくあなたが持っている可能性を説明し、あなたがより良いあなたのプロジェクトに適応した1考えることができますarticleです。個人的に

、プロジェクトは、私はいつものSymfonyの翻訳コンポーネントに固執、十分な大きさである場合:あなたは、言語ラインのこの大規模な配列のために支払うことになるhttp://symfony.com/doc/current/components/translation.html