Go vs Node.js vs PHP: フレームワークはどれが最速か？

# PHP、Go、Node.jsフレームワークの包括的な性能比較

[![Group221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/1ac93436-d55b-3340-6b73-a4e5576e532d.png)](https://leapcell.io/?lc_t=q_png)


## データソース
この性能比較のデータは、https://www.techempower.com/benchmarks/#section=data-r18&hw=cl&test=query から取得しました。このウェブサイトは、異なるプログラミング言語やフレームワークに関する豊富で権威ある性能テストデータを提供しており、我々の分析に強力なサポートを提供します。

## 分析対象のメトリック
1. **JSONシリアル化 シリアル化されたレスポンス**：主に、データをJSON形式にシリアル化してレスポンスを返す際のフレームワークの性能を測定します。このプロセスは特定のデータベース操作を含まず、フレームワーク自身のデータ処理と出力能力に焦点を当てています。
2. **平文 シンプルなレスポンス**：フレームワークがシンプルなテキストレスポンスを返す速度をテストします。同様に、データベースとの相互作用を含まず、最も基本的なHTTPレスポンスシナリオにおけるフレームワークの性能を評価するために使用されます。このシナリオはHTTP OPTIONSメソッドで一般的です。関数コンピューティングでは、ゲートウェイもこの要求に応答して、オペレーションコストを節約することができます。
3. **シングルクエリ 1行のクエリ**：1行のデータベースクエリ操作を実行して結果を返す際のフレームワークの性能を調べます。これには、フレームワークとデータベース間の相互作用効率とクエリ結果の処理速度が関係します。
4. **マルチクエリ 複数行のクエリ**：複数のデータベースクエリ操作を実行する際のフレームワークの性能を評価します。1行のクエリと比較して、複雑なデータクエリシナリオにおけるフレームワークの処理能力とリソース管理能力をより良くテストすることができます。
5. **データ更新 データ更新**：データ更新操作中のフレームワークの性能を分析します。これには、データベースとの相互作用、データ検証、更新ロジックの実行効率などの側面が含まれます。

## 分析対象
### 検討されたソリューション
1. **Node.js（関数コンピューティング）**：Node.jsのイベント駆動型およびノンブロッキングI/Oモデルを活用し、関数コンピューティングシナリオにおいて独自の利点を持っています。多数の同時要求を効率的に処理でき、フロントエンド開発と共通の構文を持っているため、フロントエンドとバックエンドの共同開発が容易になります。
2. **Go（シングルマシン デプロイメント）**：Go言語は、高性能な並列処理と軽量なランタイム環境で知られています。ここでのシングルマシン デプロイメントは、1台のマシンだけを指すわけではなく、「ゲートウェイ+関数コンピューティング」のデプロイメント方法とは異なり、独立したサーバー環境におけるGo言語の性能上の利点を最大限に引き出します。

### 具体的なアプリケーション
1. **echo (Go)**：Go言語の軽量なWebフレームワークで、使いやすく、高性能で、良好なコミュニティサポートを得ています。この性能比較では、Go言語の典型的なアプリケーションフレームワークとして分析されます。
2. **go - pgx - easyjson**：これは、pgx（Go言語用のPostgreSQLドライバーライブラリ）とeasyjson（効率的なJSONシリアル化と逆シリアル化のためのライブラリ）の組み合わせで、Go言語がPostgreSQLデータベースとJSONデータを処理する際の性能上の利点を最大限に引き出すことを目的としています。
3. **nodejs - postgres (ORM)**：ORM（オブジェクト - リレーショナルマッピング）技術を使用してPostgreSQLデータベースを操作するNode.jsベースのアプリケーションです。ORM技術はデータベース操作を簡略化し、開発効率を向上させることができますが、性能に一定の影響を与える可能性があります。
4. **php (nginx)**：広く使用されているサーバーサイドのスクリプト言語であるPHPは、多くの場合、nginxサーバーと組み合わせて使用されます。nginxは、高性能なHTTPおよびリバースプロキシサーバーとして、PHPと協調してネットワークタスクを効率的に完了することができます。
5. **php - pgsql - raw (nginx)**：これは、nginxサーバー環境でPHPのネイティブなpgsql拡張機能を使用して直接PostgreSQLデータベースを操作する方法です。ORMなどのフレームワークを使用することと比較して、このネイティブな操作方法は、一部のシナリオでより高い性能を発揮する可能性があります。
6. **lumen (nginx, ORM, MySQL)**：Lumenは、Laravelをベースとした軽量なPHPフレームワークで、nginxサーバー、ORM技術、およびMySQLデータベースと組み合わされています。便利な開発機能を提供する一方で、他のフレームワークと比較したときのその性能も考慮する必要があります。

この分析では、PHP + PostgreSQLの組み合わせは見られず、Golangとの組み合わせの多くはPostgreSQLであり、これは異なる言語がデータベース選択とアプリケーションシナリオにおけるいくつかの好みと特性を反映しています。

## 分析概要
1. **RustとC、C++の比較**：Rust言語は、性能面で極めて優れており、伝統的な高性能言語であるCやC++を超えることさえあります。これは、Rustのメモリ安全性メカニズム、効率的なコンパイル最適化、およびハードウェアリソースの完全活用によるものです。
2. **Javaの性能と人気**：Java言語も比較的高速な性能を示していますが、これらのJavaフレームワークが実際のアプリケーションでどの程度人気があるかは現在不明です。Javaは、豊富なクラスライブラリ、強力なエンタープライズレベルの開発サポート、および良好なクロスプラットフォーム性のため、多くの大規模プロジェクトで広く使用されていますが、フレームワークの人気は異なる分野やシナリオで異なる可能性があります。
3. **PHPの性能分析**：ネイティブなPHPの全体的な性能は遅くはありませんが、フレームワークと組み合わせて使用すると、性能が大幅に低下します。主に、一部のフレームワークは便利な開発機能を提供する一方で、より多くの中間層や抽象的な概念を導入し、システムの複雑さとオペレーションオーバーヘッドを増やしてしまうからです。
4. **GoとNode.jsの性能比較**：データ要求処理性能の面で、GoはNode.jsよりも速いです。テストでは、Goの性能がNode.jsの3倍以上であることが示されていますが、一部の性能損失はORMの使用に由来します。ネイティブなGoコードを書く性能は、基本的にechoフレームワークを使用するのと同じであり、echoフレームワークが設計においてGo言語の高性能な特性をうまく維持していることを示しています。

## 分析詳細
### JSONシリアル化 シリアル化されたレスポンス
| フレームワーク | 性能 |
| ---- | ---- |
| echo | 32.8% |
| go | 31.9% |
| go - pgx - easyjson | 31.4% |
| nodejs | 23.6% |
| php | 12.5% |
| lumen | 1.1% |

JSONシリアル化レスポンス性能の面で、Go言語関連のフレームワークとアプリケーションは良好なパフォーマンスを発揮しています。echo、go、およびgo - pgx - easyjsonは性能ランキングの上位にランクインしており、これはGo言語の効率的なJSON処理ライブラリと最適化されたメモリ管理メカニズムによるものです。Node.jsの性能は中程度で、一方、PHPとlumenの性能は比較的低く、それらのJSONシリアル化処理効率に改善の余地があることを反映しています。

### 平文 シンプルなレスポンス
| フレームワーク | 性能 |
| ---- | ---- |
| fasthttp | 65.3% |
| nodejs | 7.9% |
| go | 6.4% |
| echo | 5.2% |
| lumen | 0.1% |

シンプルなテキストレスポンスのテストでは、fasthttpが極めて高い性能で目立ちます。驚くべきことに、このセクションではGoがNode.jsよりも遅いです。ただし、Goがfasthttpのサードパーティライブラリに切り替えると、その性能は急上昇します。これは、Go言語自体が強力な性能の潜在力を持っており、サードパーティライブラリを合理的に選択して使用することで、特定のシナリオにおける性能を大幅に向上させることができることを示しています。このテストでのlumenの性能は極めて低く、さらなる最適化が必要です。

### シングルクエリ 1行のクエリ
| フレームワーク | 性能 |
| ---- | ---- |
| echo | 46.2% |
| go - pgx - easyjson | 43.1% |
| nodejs - postgres | 13.8% |
| php - pgsql - raw | 13.8% |
| lumen | 1.5% |

1行のクエリ性能テストでは、echoとgo - pgx - easyjsonは再び良好な性能を示し、データベースとの相互作用と1行のクエリ結果の返却において高い効率を発揮しています。nodejs - postgresとphp - pgsql - rawの性能は同等で中程度で、一方、lumenの性能は比較的低く、おそらくそのフレームワークの複雑さとORMの使用が原因で、クエリ性能が低下していると考えられます。

### マルチクエリ 複数行のクエリ
| フレームワーク | 性能 |
| ---- | ---- |
| go - pgx - easyjson | 47.8% |
| echo | 44.3% |
| php - pgsql - raw | 30.0% |
| nodejs - postgres | 14.4% |
| lumen | 8.1% |

複数行のクエリシナリオでは、go - pgx - easyjsonとechoは依然として良好なパフォーマンスを発揮し、複数のデータベースクエリ操作を効率的に処理することができます。php - pgsql - rawの性能もかなり高く、nodejs - postgresを上回っています。lumenの性能は向上していますが、他の高性能なフレームワークと比較するとまだ大きなギャップがあります。


### データ更新 データ更新
| フレームワーク | 性能 |
| ---- | ---- |
| go - pgx - easyjson | 35.4% |
| echo | 31.8% |
| php - pgsql - raw | 20.4% |
| nodejs - postgres | 8.2% |
| lumen | 6.9% |

データ更新性能テストでは、go - pgx - easyjsonとechoがリードしており、迅速にデータ更新操作を完了できます。php - pgsql - rawの性能は中程度で、一方、nodejs - postgresとlumenのデータ更新性能は比較的低く、これはおそらくそれらのデータベース操作方法とフレームワークの実装メカニズムに関係があると思われます。

## まとめ
1. **シングルマシン デプロイメントソリューションの選択**：シングルマシン デプロイメント方法を採用する場合、echoを基本フレームワークとして使用するのは良い選択です。echoは良好なコミュニティサポートを得ており、開発者はさまざまなリソースと支援を簡単に得ることができます。同時に、そのシンプルで使いやすい特性により、開発コストと学習曲線を低減でき、性能面でも良好なパフォーマンスを発揮し、ほとんどのシングルマシン デプロイメントシナリオのニーズを満たすことができます。
2. **echoとfasthttpの選択**：もしすでにechoフレームワークを使用することが決まっている場合、fasthttpを検討することはお勧めしません。echoはバージョン2でfasthttpをサポートしていましたが、echoの作者はhttps://github.com/labstack/echo/issues/665 で諦めた理由を説明しており、主にフレームワークの単純さとコミュニティの互換性を維持し、可能な限り標準ライブラリを使用するためです。これにより、echoは高性能を維持しつつ、コミュニティのエコシステムとより良く統合することができます。
3. **関数コンピューティングソリューションの選択**：関数コンピューティングシナリオに対しては、Node.jsが良い選択です。Node.jsは受け入れられる性能を備えており、関数コンピューティングにおける並列処理と応答速度の要件を満たすことができます。同時に、Node.jsとフロントエンドの共通の構文により、フロントエンドとバックエンドの開発者がより簡単に協力することができ、技術スタックの違いによるコミュニケーションコストと開発の難易度を低減することができます。
4. **PHPの性能とアプリケーション分析**：上記の性能テストから判断すると、PHP自体の性能は大きな問題ではありませんが、その標準ライブラリが古すぎます。実際の開発では、開発効率を向上させるためにフレームワークを使用する必要があります。ただし、一般的なフレームワークの使用は性能の急激な低下を招きます。そして、歴史的な理由から、PHPはネットワークタスクを効率的に完了するためにNginxと組み合わせる必要があり、これによりシングルマシン デプロイメントの手順が比較的多くなり、デプロイと保守の複雑さが増します。PHPを使用して開発することを選択する際は、性能、開発効率、デプロイコストなどの複数の要素を総合的に検討し、特定のアプリケーションシナリオと要件に応じて合理的な決定を下す必要があります。

# [Leapcell: ウェブホスティングに最適なサーバレス プラットフォーム](https://leapcell.io/?lc_t=q_png)

[![barndpic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/c21fecc0-14cd-cff0-7a5d-2b81c288b1e7.png)](https://leapcell.io/?lc_t=q_png)


最後に、ウェブサービスをデプロイするための最高のプラットフォーム：[Leapcell](https://leapcell.io/?lc_t=q_png) をおすすめします。

### 1. 多言語対応
 - JavaScript、Python、Go、またはRustで開発可能。  

### 2. 無制限のプロジェクトを無料でデプロイ
 - 使用量に応じてのみ支払い — 要求がなければ料金はかかりません。

### 3. 圧倒的なコスト効率
 - 使いきり課金で、アイドル料金はありません。  
 - 例：平均応答時間60msで25ドルで694万回の要求をサポート。  

### 4. ストリームライン化された開発者体験
 - 直感的なUIによる簡単なセットアップ。  
 - 完全自動化されたCI/CDパイプラインとGitOps統合。  
 - アクション可能な洞察のためのリアルタイムメトリックとロギング。  

### 5. 簡単なスケーラビリティと高性能
 - 高い並列処理を簡単に処理するための自動スケーリング。  
 - オペレーションオーバーヘッドゼロ — 構築に集中できます。  

[![Frame3-withpadding2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/acf6062b-472e-526c-4029-540c7d4a8b06.png)](https://leapcell.io/?lc_t=q_png)


[ドキュメントでもっと詳しく探索！](https://docs.leapcell.io/)

LeapcellのTwitter: [https://x.com/LeapcellHQ](https://x.com/LeapcellHQ)