まえがき
UIKitのlessファイルをscssに変換するCLI Applicationを作成して、気づいた事があります。
文字列を置き換える為に、lessファイルをfile()関数で読み込んで、配列で処理しています。1
@useから始まる文4行分を、約1000行あるファイルの先頭に追加する必要がありました。
配列を追加する場合、array_merge()関数があります。
他にも、array_push()関数など、結果的に同じような処理が出来る方法がないか、調べてみました。
使用環境
| Name | Version |
|---|---|
| PHP | v8.4.7 |
| Laravel Zero | 11.x |
| FrankenPHP | 1.6.2 |
本題
先頭に追加したい4行分が$addという変数に、配列で入っています。
1000行分は$arrayという変数に、配列で入っています。
Info
かかった時間は、file()関数で約1000行分読んだ時間も含まれるので、参考値です。
関数の優劣や速さの違いを保証する記事では、ありません。
関数の優劣や速さの違いを保証する記事では、ありません。
A.array_merge()
return array_merge($add, $array);
B.array_push()
array_push($add, ...$array);
return $add;
C.DS\Vector
$vector = new \DS\Vector($add);
return $vector->merge($array)->toArray();
D.スプレッド構文
return [...$add, ...$array];
E.implode() + 結合代入演算子
$contents = implode('', $array);
$prepend = implode('', $add);
$prepend .= $contents;
return $prepend;
配列要素を文字列にして、文字列を追加しますが、処理の最後にfile_put_contents()関数を使うので、結果は同じになります。
あとがき
ベンチマークを見ると、100回とか繰り返している場合があります。
array_merge()を、100回繰り返す必要あるのでしょうか?
今回の場合、必要ないと考えました。
UIKitのコンポーネントは、約60あるので、少しでも速くしたいと思って、試してみました。
配列結合演算子という方法もありますが、今回は該当しないはずです。
途中経過で、今の時点では何とも言えませんが、文字列で処理した場合、preg_match_all()関数を使うからか、配列で処理する場合と、そんなに変わらないような気がします。
FrankenPHP
DS\Vectorは、peclでインストールしているので、そのままでは動かないみたいです。
| php-cli | FrankenPHP | |
|---|---|---|
| A | 0.389978ミリ秒 | 0.246035ミリ秒 |
| B | 0.619905ミリ秒 | 0.207205ミリ秒 |
| C | 0.307179ミリ秒 | no data |
| D | 0.227177ミリ秒 | 0.166017ミリ秒 |
| E | 0.244699ミリ秒 | 0.193126ミリ秒 |
- 文字列全体の置換より、一行の方が、正規表現が書きやすいような気がする(私にとって正規表現は難しい)↩