PHPには、スマート文字列(smart_str?)と呼ばれる内部データ構造があり、そこには長さとバッファサイズの両方が格納されます。つまり、連結のパフォーマンスを向上させるために、文字列の長さよりも多くのメモリが割り当てられます。なぜこのデータ構造が実際のPHP文字列に使用されていないのですか?それは少ないメモリ割り当てとより良いパフォーマンスにつながるでしょうか?PHPは文字列に内部スマート文字列を使用しないのはなぜですか?
答えて
通常のPHP文字列(PHP 7以降)は、文字列の長さと文字データ配列の両方を含むzend_string
タイプで表されます。 zend_string
は通常、文字データを正確に合わせるために割り当てられます(アラインメントにもかかわらず)。追加文字を追加する場所はありません。
smart_str
構造体には、zend_string
へのポインタと割り当てサイズが含まれています。今回は、zend_string
はでなく、に正確に割り当てられます。代わりに割り当てが大きすぎるため、高価な再割り当てなしで追加の文字を追加することができます。
smart_str
の再割り当てポリシーは次のとおりです。まず、合計サイズが256バイトになります(zend_stringヘッダーからマイナスアロケータオーバーヘッド)。このサイズを超えると、4096バイト(オーバーヘッドを引いたもの)に再割り当てされます。その後、サイズは4096バイト単位で増加します。
ここで、すべての文字列をsmart_str
と置き換えたとします。これは、単一の文字列でさえ256バイトの最小割り当てサイズを持つことを意味します。使用している文字列の大部分が小さいことを考えると、これは許容できないオーバーヘッドです。
本質的に、これは古典的なパフォーマンス/メモリのトレードオフです。我々は、デフォルトでメモリコンパクトな表現を使用し、小さな部分から大きな文字列が構築される場合のように、より高速であるがメモリ効率の良い表現に切り替えるのが最も効果的な場合に切り替えます。
確かに、通常のPHP文字列処理の必要性に合わせて 'smart_str'を調整することはできますか?小さいサイズから始めて、連結が起こるたびに倍増します。特に、文字列バッファはPHP(!)で実装することが不可能です。また、特にメモリはCPUサイクルよりも豊富であるためです。 –
@OlleHärstedtはい、キャパシティの保存を開始したら、合理的な割り当てポリシーを見つけることは可能でしょう。私は特にsmart_strについてここで答えていました。比較的安全なことは、アロケータと統合することです(小さなallocに対して)とにかく使用される次の最大バケットサイズを選択することです。トリッキーなことがあれば、(疑似フロートエンコーディングを使用して)容量を格納するために追加のメモリオーバヘッドを導入することさえ可能です。これはHHVMのことです;) – NikiC
Hm、そのトリッキーなことを説明するリンクがありますか?興味深いですね。 –
- 1. PHP文字列のスマートな文字列区切り
- 2. .NET XMLパーサーが文字列内で特殊文字を使用できないのはなぜですか?
- 3. C++チュートリアルで文字列の配列が文字列に使用されているのはなぜですか?
- 4. 文字列内の部分文字列
- 5. Set-ADUserコマンドで数値文字列で文字列を使用できないのはなぜですか?
- 6. コードが文字列内の数字や文字を正しく識別しないのはなぜですか?
- 7. スウィフト4:部分文字列(with :) :)は使用しないでください:文字列部分文字列を使用してください
- 8. 文字列でない文字列に
- 9. C# - 文字列の内部で3進演算を使用できないのはなぜですか?
- 10. は、PHPは、私は2つの文字列を比較する(通常の対ビルトインPHP関数)PHPでスマートなアルゴリズムを探しています文字列アルゴリズム
- 11. 文字列内の文字列を文字列内で渡すにはどうすればよいですか?
- 12. ExpressJSで部分文字列が動作しないのはなぜですか?
- 13. ファイルからの文字列が一般的な文字列と等しくないのはなぜですか?
- 14. PHP - PHPでpreg_matchを使用して文字列から文字列を取得
- 15. .equals()を使用して文字列内の文字をチェックしていない
- 16. phpで文字列内の文字列を検索していますか?
- 17. PHPの文字列の内部表現
- 18. 制約で文字列を使用できないのはなぜですか?
- 19. 正確な部分文字列を使用したフィルタ文字列
- 20. 文字列型または文字列型で一致しないのはなぜですか?
- 21. クラス内に文字列を宣言できないのはなぜですか?
- 22. 正確な部分文字列をPHPの文字列に数える
- 23. 分割文字列ではなく内部の引用符
- 24. 複数の文字列を1つの文字列に結合して後で元の文字列に分割するスマートな方法はありますか?
- 25. スマートASCII文字列表現
- 26. なぜこの文字列トークンは文字列にキャストされますか?
- 27. PHPの文字列内に文字列を追加する
- 28. 行内のn番目の文字列内での文字列または部分文字列の検索
- 29. 文字列内の有効な文字
- 30. 文字列が同じでないのはなぜですか?
私たちは何バイトについて話していますか? lol –
@AdamBuchananSmith何のバイト? –
うん...メモリの。 –