C++ で記述された API があり、開発には Xcode IDE を使用し、Silicon Frameworkを Web フレームワークとして使用し、ODBを ORM として使用して、MySQL (読み取りと書き込み) および SQLite (読み取り専用) データベースに接続します。CMake と GNU コンパイラを使用して API をコンパイルし、Debian または Ubuntu VM にデプロイします。私の問題は、API を Xcode で実行する場合と VM で実行する場合に大きなパフォーマンスの違いがあり、その違いを最小限に抑えることができないことです。
Xcode で実行しているときは、MacBook Pro 13 インチ、Quad-Core Core i5 プロセッサ、16GB RAM、512GB SSD、Apple クラン バージョン 11.0.3 を使用しています。
VM で実行する場合、2vCPU、7.5 GB の RAM、50 GB の標準永続ディスクを備えた Google コンピューティング インスタンス (GCE) を使用しています。Docker エンジンを使用して実行しています。1 つのコンテナーは C++ API 用で、もう 1 つは MySQL 用です。これらの仕様は、API を意図したとおりに実行するのに十分すぎるほどのものです。
私はcurlを使用して実行時間を計算しています。接続に関連する遅延をなくすために常に同じデバイスで実行しています。すべてのテストは同じリクエストと同じデータに対して行われ、時間は10回の連続したリクエストの平均です。
Debian または Ubuntu でのすべてのテストは、コンパイルに CMake を使用した後に行われました。動的にリンクされた mysqlclient を除き、リンクされたすべてのライブラリは静的であり、以下を使用します。
CMAKE_CXX_FLAGS="-w -O3 -flto -frtti -fno-common -fstrict-aliasing -fexceptions"
C++14 は、Xcode と CMake の両方でコンパイルに使用されます。
テストと結果のリストは次のとおりです。
- Xcode と XAMPP MySQL を使用する MacBook の場合: 5.2 秒。
- Docker、Debian 9 コンテナー、GNU 6.3 コンパイラー、ODB 2.4、および MySQL 5.7 コンテナーを使用する MacBook: 15.1 秒。
- Docker を使用しない GCE (Google Compute Engine) で、Debian 9、GNU 6.3 コンパイラ、ODB 2.4、および MySQL サーバーを使用: 11.4 秒。
- Docker を使用した GCE、Debian 9、GNU 6.3 コンパイラ、ODB 2.4、および MySQL 5.7 コンテナーを使用した場合: 13.1 秒。
- Docker を使用した GCE、Ubuntu 20、GNU 9.3 コンパイラ、ODB 2.5、および MySQL 5.7 コンテナーを使用した場合: 11.2 秒。
また、GCE に SSD ディスクを使用してみましたが、これは結果に影響しませんでした。また、コンパイラを GNU から Clang に変更すると、パフォーマンスが低下しました。
私の理想的なケースは、Docker を使用して実行し続けることです。しかしdockerを使わなくても、CMakeでコンパイルした場合の実行時間は、Xcodeを使った場合の2倍です。
このパフォーマンスの違いが存在する理由は何ですか? 最小化できますか?研究とテストの出発点があれば素晴らしいと思います。