2015-09-17 14 views
5

PHPには、スマート文字列(smart_str?)と呼ばれる内部データ構造があり、そこには長さとバッファサイズの両方が格納されます。つまり、連結のパフォーマンスを向上させるために、文字列の長さよりも多くのメモリが割り当てられます。なぜこのデータ構造が実際のPHP文字列に使用されていないのですか?それは少ないメモリ割り当てとより良いパフォーマンスにつながるでしょうか?PHPは文字列に内部スマート文字列を使用しないのはなぜですか?

+0

私たちは何バイトについて話していますか? lol –

+0

@AdamBuchananSmith何のバイト? –

+0

うん...メモリの。 –

答えて

6

通常のPHP文字列(PHP 7以降)は、文字列の長さと文字データ配列の両方を含むzend_stringタイプで表されます。 zend_stringは通常、文字データを正確に合わせるために割り当てられます(アラインメントにもかかわらず)。追加文字を追加する場所はありません。

smart_str構造体には、zend_stringへのポインタと割り当てサイズが含まれています。今回は、zend_stringでなく、に正確に割り当てられます。代わりに割り当てが大きすぎるため、高価な再割り当てなしで追加の文字を追加することができます。

smart_strの再割り当てポリシーは次のとおりです。まず、合計サイズが256バイトになります(zend_stringヘッダーからマイナスアロケータオーバーヘッド)。このサイズを超えると、4096バイト(オーバーヘッドを引いたもの)に再割り当てされます。その後、サイズは4096バイト単位で増加します。

ここで、すべての文字列をsmart_strと置き換えたとします。これは、単一の文字列でさえ256バイトの最小割り当てサイズを持つことを意味します。使用している文字列の大部分が小さいことを考えると、これは許容できないオーバーヘッドです。

本質的に、これは古典的なパフォーマンス/メモリのトレードオフです。我々は、デフォルトでメモリコンパクトな表現を使用し、小さな部分から大きな文字列が構築される場合のように、より高速であるがメモリ効率の良い表現に切り替えるのが最も効果的な場合に切り替えます。

+0

確かに、通常のPHP文字列処理の必要性に合わせて 'smart_str'を調整することはできますか?小さいサイズから始めて、連結が起こるたびに倍増します。特に、文字列バッファはPHP(!)で実装することが不可能です。また、特にメモリはCPUサイクルよりも豊富であるためです。 –

+1

@OlleHärstedtはい、キャパシティの保存を開始したら、合理的な割り当てポリシーを見つけることは可能でしょう。私は特にsmart_strについてここで答えていました。比較的安全なことは、アロケータと統合することです(小さなallocに対して)とにかく使用される次の最大バケットサイズを選択することです。トリッキーなことがあれば、(疑似フロートエンコーディングを使用して)容量を格納するために追加のメモリオーバヘッドを導入することさえ可能です。これはHHVMのことです;) – NikiC

+0

Hm、そのトリッキーなことを説明するリンクがありますか?興味深いですね。 –

関連する問題