gpt回答

在 Linux 上,使用 g++ 编译 C++ 项目时,默认的编译模式既不是 Debug 也不是 Release,而是无优化不包含调试信息的状态。这意味着如果你不显式地指定编译选项,g++ 将不会启用任何优化,也不会包括调试信息。

默认编译设置

  • 优化: 默认情况下,g++ 不启用优化(即没有 -O 选项)。
  • 调试信息: 默认情况下,g++ 不包含调试信息(即没有 -g 选项)。

总结

  • release是debug的10倍速度以上,但是不同release之间速度差异不大,且default和debug类似。
  • debug文件最大,relwithdebinfo有调试信息,不是最小,release最小。
  • 可以看出windows上msvc,release是优化/O2,debug是/Od。
  • clang编译器debug模式是最快的。release模式,速度都差不多。
  • debug/release模式中msvc都是最慢的。
  • 新版mingw gcc14,比旧版gcc7.3,release速度要快。
  • -O2 和 -O3看不出差距,平时都可以。
  • windows/centos/mac/虚拟机ubuntu,默认-O0。所以cmake平时需要开release,才可以。
  • 加入调试信息,-g,不会影响速度。

测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <vector>
#include <chrono>
#include <cmath>
#include <numeric>
#include <algorithm>

// 矩阵乘法
void matrix_multiply(const std::vector<std::vector<int>>&A, const std::vector<std::vector<int>>&B,
std::vector<std::vector<int>>&C) {
int n = A.size();
int m = B[0].size();
int k = B.size();

for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
C[i][j] = 0;
for (int l = 0; l < k; ++l) {
C[i][j] += A[i][l] * B[l][j];
}
}
}
}

void printVersion() {
// 输出编译器
// 检测并输出编译器信息
#if defined(__clang__)
std::cout << "Compiler: Clang " << __clang_version__ << std::endl;
#elif defined(__GNUC__) || defined(__GNUG__)
std::cout << "Compiler: GCC " << __VERSION__ << std::endl;
#elif defined(_MSC_VER)
std::cout << "Compiler: MSVC " << _MSC_VER << std::endl;
#else
std::cout << "Compiler: Unknown" << std::endl;
#endif
}

int main() {
// 矩阵维度
const int N = 400; // 可以调整为更大的值以增加计算量
// 运行次数
const int num_tests = 10;
std::vector<double> times(num_tests);

for (int test = 0; test < num_tests; ++test) {
// 初始化矩阵
std::vector<std::vector<int>> A(N, std::vector<int>(N, 1));
std::vector<std::vector<int>> B(N, std::vector<int>(N, 2));
std::vector<std::vector<int>> C(N, std::vector<int>(N, 0));

// 记录开始时间
auto start = std::chrono::high_resolution_clock::now();

// 执行矩阵乘法
matrix_multiply(A, B, C);

// 记录结束时间
auto end = std::chrono::high_resolution_clock::now();

// 计算并保存时间差
std::chrono::duration<double> duration = end - start;
times[test] = duration.count();
std::cout << test << " cost time: " << times[test] << +" s" << std::endl;
}

// 计算平均值
double sum = std::accumulate(times.begin(), times.end(), 0.0);
double mean = sum / num_tests;

// 计算方差
double sq_sum = std::inner_product(times.begin(), times.end(), times.begin(), 0.0);
double variance = (sq_sum / num_tests) - (mean * mean);

// 计算标准差
double stddev = std::sqrt(variance);
std::cout << "Average time taken: " << mean << "+-" << stddev << " seconds" << std::endl;

printVersion();


return 0;
}

windows速度测试r9000-2021

MSVC 19.40.33814.0

debug

1.01553+-0.0173908 seconds

release

0.0932541+-0.00367147

release with debug info

Average time taken: 0.091748+-0.00464114 seconds

min size release

Average time taken: 0.0943458+-0.00495204 seconds

default

Average time taken: 1.04789+-0.046057 seconds

链接选项

1
2
3
4
5
6
7
8
9
10
11
build test.exe: CXX_EXECUTABLE_LINKER__test_Release CMakeFiles\test.dir\main.cpp.obj
FLAGS = /DWIN32 /D_WINDOWS /EHsc /O2 /Ob2 /DNDEBUG -MD
LINK_FLAGS = /machine:x64 /INCREMENTAL:NO /subsystem:console
LINK_LIBRARIES = kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
OBJECT_DIR = CMakeFiles\test.dir
POST_BUILD = cd .
PRE_LINK = cd .
TARGET_COMPILE_PDB = CMakeFiles\test.dir\
TARGET_FILE = test.exe
TARGET_IMPLIB = test.lib
TARGET_PDB = test.pdb
1
2
3
4
5
6
7
8
9
10
11
build test.exe: CXX_EXECUTABLE_LINKER__test_Debug CMakeFiles\test.dir\main.cpp.obj
FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -MDd -Zi
LINK_FLAGS = /machine:x64 /debug /INCREMENTAL /subsystem:console
LINK_LIBRARIES = kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
OBJECT_DIR = CMakeFiles\test.dir
POST_BUILD = cd .
PRE_LINK = cd .
TARGET_COMPILE_PDB = CMakeFiles\test.dir\
TARGET_FILE = test.exe
TARGET_IMPLIB = test.lib
TARGET_PDB = test.pdb

mingw gcc13.1

debug

Average time taken: 0.717199+-0.0281037 seconds
Compiler: GCC 13.1.0

release

Average time taken: 0.047984+-0.00180785 seconds
Compiler: GCC 13.1.0

mingw gcc14.1

debug

Average time taken: 0.632808+-0.0189124 seconds
Compiler: GCC 14.1.0

release

Average time taken: 0.0469553+-0.00102693 seconds
Compiler: GCC 14.1.0

clang18.5

debug

Average time taken: 0.578604+-0.015456 seconds
Compiler: Clang 18.1.5

release

Average time taken: 0.0460767+-0.00232557 seconds
Compiler: Clang 18.1.5

mingwqt730

debug

Average time taken: 0.608789+-0.0119655 seconds
Compiler: GCC 7.3.0

release

Average time taken: 0.0576486+-0.00162774 seconds
Compiler: GCC 7.3.0

mingw gcc 14.1手动编译

默认

1
g++   main.cpp -o test.exe

Average time taken: 0.624644+-0.0108304 seconds
Compiler: GCC 14.1.0

1
g++  -O0  main.cpp -o test.exe

Average time taken: 0.629093+-0.0114114 seconds
Compiler: GCC 14.1.0

1
g++  -O1  main.cpp -o test.exe

Average time taken: 0.0804241+-0.00115119 seconds
Compiler: GCC 14.1.0

1
g++  -O2  main.cpp -o test.exe

Average time taken: 0.0473159+-0.0018409 seconds
Compiler: GCC 14.1.0

1
g++  -O3  main.cpp -o test.exe

Average time taken: 0.0456077+-0.000531312 seconds
Compiler: GCC 14.1.0

加入调试信息

1
g++  -O2 -g  main.cpp -o test.exe

Average time taken: 0.0464482+-0.00176307 seconds
Compiler: GCC 14.1.0

虚拟机-r9000p-ubuntu24

默认

Average time taken: 0.670076+-0.0136274 seconds
Compiler: GCC 13.2.0

-O1

Average time taken: 0.0970865+-0.00210742 seconds
Compiler: GCC 13.2.0

-O2

Average time taken: 0.0552798+-0.00120039 seconds
Compiler: GCC 13.2.0

-O3

Average time taken: 0.0552372+-0.000582813 seconds
Compiler: GCC 13.2.0

虚拟机-r9000p-centos7

默认

1
g++   main.cpp -o test -std=c++11

Average time taken: 0.673767+-0.0126313 seconds
Compiler: GCC 4.8.5 20150623 (Red Hat 4.8.5-44)

1
g++  -O0 main.cpp -o test -std=c++11

Average time taken: 0.665408+-0.0191855 seconds
Compiler: GCC 4.8.5 20150623 (Red Hat 4.8.5-44)

1
g++  -O1 main.cpp -o test -std=c++11

Average time taken: 0.0948795+-0.00221561 seconds
Compiler: GCC 4.8.5 20150623 (Red Hat 4.8.5-44)

1
g++  -O2 main.cpp -o test -std=c++11

Average time taken: 0.0525293+-0.00172819 seconds
Compiler: GCC 4.8.5 20150623 (Red Hat 4.8.5-44)

1
g++  -O3 main.cpp -o test -std=c++11

Average time taken: 0.0547469+-0.00279207 seconds
Compiler: GCC 4.8.5 20150623 (Red Hat 4.8.5-44)

mac m3pro

debug

Average time taken: 0.294708+-0.00591219 seconds
Compiler: Clang 15.0.0 (clang-1500.3.9.4)

release

Average time taken: 0.0505498+-0.00216094 seconds
Compiler: Clang 15.0.0 (clang-1500.3.9.4)