3

我有一个用 C++ 编写的 API,我使用 Xcode IDE 进行开发,并使用Silicon Framework作为 Web 框架,使用ODB作为 ORM 来连接 MySQL(读写)和 SQLite(只读)数据库。我使用 CMake 和 GNU 编译器编译 API,以将其部署到 Debian 或 Ubuntu VM。我的问题是在 Xcode 上运行我的 API 和在 VM 上运行它之间存在很大的性能差异,我无法将差异最小化。

当我在 Xcode 上运行时,我使用的是 MacBook Pro 13 英寸、四核 Core i5 处理器、16GB RAM 和 512GB SSD,Apple clang 版本 11.0.3。

在 VM 上运行时,我使用具有 2vCPU、7.5GB RAM 和 50GB 标准永久性磁盘的 Google Compute Instance (GCE),并且使用 docker 引擎、一个用于 C++ API 的容器和另一个用于 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 秒。

我也尝试将 SSD 磁盘用于 GCE,但这并不影响结果。并且将编译器从 GNU 更改为 Clang 会导致性能下降。

我的理想情况是继续使用 Docker 运行。但即使不使用 docker,我使用 CMake 编译时的执行时间也是使用 Xcode 时的两倍。

知道为什么存在这种性能差异吗?可以最小化吗?如果我有一个研究和测试的起点,那就太好了。

4

0 回答 0