c++ - Mac 和 Linux 上 C++ 的性能差异(Linux 上比 Mac 慢)
问题描述
我有一个用 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 时的两倍。
知道为什么存在这种性能差异吗?可以最小化吗?如果我有一个研究和测试的起点,那就太好了。
解决方案
推荐阅读
- python - 使用fuzzywuzzy python比较和分组字符串的嵌套循环
- java - 创建适配器的新实例后,FragmentStateAdapter() 的 createFragment() 方法不再运行
- php - 登录后更改重定向路径并使用 Laravel 8 使用 Google 登录
- python - 有没有办法完全遍历长度不可预测但结构可预测的python字典?
- python - 如何正确重塑输入数据以在 CNN 模型中输入?
- reactor-netty - 如何为“目录”路由设置默认文件
- c - 如何正确遍历 char 指针?
- javascript - 如何自定义 Calendly Inline Embed CSS & Javascript 以适应 Webflow 设计?
- json - Python中,如何根据多个属性值设置替换一个json子对象?
- c# - 如何删除键盘上的完成和取消按钮?