PHP ルーティング コントローラーのパフォーマンス テスト
私は少し前に時間をかけてマイクロ ルーティング コントローラーを作成しました。ただし、設計中は定期的なマッチングや配列のループなどの時間のかかる操作は可能な限り避けました。できるだけ時間を節約するようにしてください。しかし、それはすべて理論上の話です。今日実際にテストしてみました。
ルート配布のパフォーマンスをテストするための php-router-benchmark という専用のリポジトリが github 上にあります。
php-r3、Pux、FastRoute、Symfony2 Dumped、Symfony2、および Aura v2 ルーティング コントローラーのパフォーマンスをテストしました。一般的に、R3 と FastRoute は最悪の環境下で最高のパフォーマンスを発揮しました。このうち、R3 と Pux は C 言語で実装されたプラグインであり、C 言語でのパフォーマンス上の利点があります。
まず、このベンチマーク ライブラリのコピーをフォークし、独自の Router テスト コードを追加しました。同じ試験条件。 R3 がインストールされていないため、Pux のインストールは失敗します。したがって、このテストは FastRoute、Symfony2 Dumped、Symfony2、Aura v2、および Router のみを対象としています。
それは問題ありません。とにかく、これらはすべて純粋な PHP で実装されています。他の 2 つの C 言語実装は今回は比較しません。
最初のテストは最悪のテストで、2 つのテスト ケースが含まれています。1 つは 404 not found、もう 1 つはリスト内の一致する最後のテスト ケースです。最悪の2つの状況です。
このベンチマークは、それぞれ 9 つの引数を持つ 1,000 個のルートをランダムに生成し、プレフィックスとサフィックスを付けたルートを生成します。 🎜>
このベンチマークは 10 個のテストで構成され、各テストが 1,000 回実行され、結果が取り除かれ、平均値の 3 標準偏差から外れる値が破棄されます。
上の表のデータを見ると、私自身のルーターは両方のテスト ケースの最悪のケースで最高のパフォーマンスを発揮します。そして他の人たちを数通り離れたところに投げ捨てました。これは主に、ルーティング テーブルを格納するためにツリー構造の PHP 配列が使用されていることが原因であるようです。したがって、トラバース時には常に O(log n) の時間計算量を達成できます。
次に、最初の URL が一致する最良の状況を見てみましょう。
このベンチマークは、各ルーターが 9 つの引数を持つ 1,000 個のルートにどれだけ早く一致できるかをテストします。
このベンチマークは、各テストで構成されます。
Test Name | Results | Time | + Interval | Change |
---|---|---|---|---|
FastRoute - first route | 998 | 0.0000498390 | +0.0000000000 | baseline |
Symfony2 Dumped - first route | 995 | 0.0000517531 | +0.0000019141 | 4% slower |
Router - first route | 994 | 0.0001499363 | +0.0001000972 | 201% slower |
Aura v2 - first route | 998 | 0.0008559464 | +0.0008061073 | 1617% slower |
Symfony2 - first route | 998 | 0.0012734995 | +0.0012236604 | 2455% slower |
この表のデータを見ると、結果は枝刈りされて平均化されます。各ライブラリのテストケース。テストに「最適な」ケースです。ここで引用符が追加されている理由は、Router がストレージにツリー構造を使用しており、他のいくつかのライブラリのいわゆる「最良の」状況が実際には当てはまらないためです。最初のものとは一致しません。つまり、このテスト ケースでも、Router は平均時間を他のいくつかのライブラリの最良時間と比較していると言えます。 ! ! (上の表と下の表の時間の絶対値を比較すると、他のいくつかのライブラリに関する以下の「最良の」状況は、上の最悪の状況よりもはるかに優れていることがわかりますが、Router ライブラリのパフォーマンスは実際にはその逆ですそして、どのような状況であっても、時間は比較的近いです。これは、前述のツリーノードトラバーサルの比較的固定された時間計算量に関連しています)
これは何回テストされましたか次回は、純粋な PHP で実装された 2 つのライブラリを比較していきます。 ! !