私は卒業して C# から移行しました。PHP を学習する過程で、PHP には C# のような stringbuilder 型がないことがわかりました。
C# で文字列を複数回操作する場合、string よりも stringbuilder の方が効率的であることはわかっているのに、なぜ PHP が stringbuilder を実装しないのかを聞きたいのです。
また、配列を使用して stringbuilder をシミュレートすると、効率が向上しますか?
違いがないように感じますが、メモリのオーバーヘッドが多くなり、コスト効率が悪くなります。
文字列はシミュレーションよりもはるかに高速です。
文字列
$starttime = getMicrotime();$str = '';for($i=0;$i<100000;$i++){ $str .= $i;}$endtime = getMicrotime();printf("run time %f ms\r\n", (float)($endtime-$starttime)*1000); function getMicrotime(){ list($usec, $sec) = explode(' ', microtime()); return (float)$usec + (float)$sec;}
$starttime = getMicrotime();$arr = array();for($i=0;$i<100000;$i++){ array_push($arr, $i);}$endtime = getMicrotime();printf("run time %f ms\r\n", (float)($endtime-$starttime)*1000);function getMicrotime(){ list($usec, $sec) = explode(' ', microtime()); return (float)$usec + (float)$sec;}
原理の説明が見つかりました:
PHP のすべての変数は同じ基礎構造 Zval を持っています。 Zval 構造から、PHP の文字列は、C++ の文字列と同様に、実際のデータへのポインタと長さ構造で構成されていることがわかります。 c とは異なり、長さは実際の変数で表されるため、その文字列はバイナリ データ (含む) にすることができます。