基准测试 - g++ 生成与 MSVC 不同的代码
Benchmarking - g++ produces different code from MSVC
我正在编写一个基准测试程序,用于测量程序的速度和内存使用情况。我在 VS19 工作,但我的测试将在 linux 机器上 运行,所以我需要用 g++ 编译它。我的问题是,在 VS19 中我的代码产生了我期望的正确结果,用 g++ 编译它产生了错误的结果。
问题出在内存测量中。在 Functions.cpp 中,我重载了 new 和 delete
AllocationMetrics s_allocationMetrics;
void* operator new(size_t size) {
//cout << "Allocate " << size << " bytes\n";
s_allocationMetrics.totalMemory += size;
return malloc(size);
}
void operator delete(void* ptr, size_t size) {
//cout << "Deallocate " << size << " bytes\n";
s_allocationMetrics.totalFree += size;
free(ptr);
}
并且在 Functions.h 我创建了这个结构,它跟踪内存分配
struct AllocationMetrics {
uint64_t totalMemory = 0;
uint64_t totalFree = 0;
uint64_t getCurrentUsage() { return totalMemory - totalFree; }
uint64_t maxMem=0;
void setMaxMem() {
uint64_t temp= getCurrentUsage();
if (temp > maxMem)
maxMem = temp;
}
void resetMaxMem() { maxMem = 0; }
};
在 Functions.cpp 的函数中,我需要测量,我调用 setMaxMem,在我的 Benchmark.cpp 中,我调用 resetMaxMem ,在适当的时候。该结构在 Functionc.cpp 中声明,在所有其他 .cpp 文件中它被声明为 extern。
对于这个例子,我在一个循环中 运行 我的基准测试 6x,并且使用 Visual Studio 的 MSVC 我得到了预期的内存结果,以及所有可能的设置(调试、发布等)。
Params: 1063 x 24 5 5 255
Sorting 0.0084792s 0.36439MB
Stripes 0.0179886s 1.64792MB
Params: 1063 x 24 5 5 255
Sorting 0.0080979s 0.364406MB
Stripes 0.0165975s 1.64794MB
Params: 1063 x 24 5 5 255
Sorting 0.0080586s 0.364422MB
Stripes 0.0163024s 1.64795MB
Params: 1063 x 24 5 5 255
Sorting 0.0081503s 0.364438MB
Stripes 0.016274s 1.64797MB
Params: 1063 x 24 5 5 255
Sorting 0.0079747s 0.364454MB
Stripes 0.0170647s 1.64799MB
Params: 1063 x 24 5 5 255
Sorting 0.0079046s 0.364486MB
Stripes 0.0160469s 1.64801MB
当我使用 g++ 编译器 g++ Source.cpp Functionc.cpp benchmarking.cpp
编译相同的代码时,我得到了这些错误的结果
Params: 1063 x 24 5 5 255
Sorting 0.063828s 1.0806MB
Stripes 0.171574s 3.73044MB
Params: 1063 x 24 5 5 255
Sorting 0.061869s 4.32227MB
Stripes 0.172318s 6.97212MB
Params: 1063 x 24 5 5 255
Sorting 0.067859s 7.56395MB
Stripes 0.170573s 10.2138MB
Params: 1063 x 24 5 5 255
Sorting 0.063863s 10.8057MB
Stripes 0.171541s 13.4555MB
Params: 1063 x 24 5 5 255
Sorting 0.062963s 14.0473MB
Stripes 0.170528s 16.6972MB
Params: 1063 x 24 5 5 255
Sorting 0.064827s 17.2891MB
Stripes 0.171541s 19.9389MB
在g++编译中其他一切都是正确的,我尝试了不同的优化级别,这个内存错误没有改变。我使用的是 g++ (MinGW.org GCC-6.3.0-1) 6.3.0 版本。我也试过运行用 clang 来解决这个问题,但出现了同样的错误。
似乎 delete 重载对 g++ 没有影响,或者 delete 在释放时没有被调用变量。
我尝试在 Windows 和 Linux(相同版本的 g++)上编译,这个错误出现在两个版本中。
EDIT1: 忘记了一行带有 temp 定义的代码。
感谢 Jarod42 提出的有用意见。
问题在于 GCC 6.3.0 选择了不同的删除重载,即 delete(void*)
而不是我所针对的 delete(void*, size_t size)
。
为了让 GCC 正常运行,我将其升级到更新的 11.2.0 版本。
我正在编写一个基准测试程序,用于测量程序的速度和内存使用情况。我在 VS19 工作,但我的测试将在 linux 机器上 运行,所以我需要用 g++ 编译它。我的问题是,在 VS19 中我的代码产生了我期望的正确结果,用 g++ 编译它产生了错误的结果。
问题出在内存测量中。在 Functions.cpp 中,我重载了 new 和 delete
AllocationMetrics s_allocationMetrics;
void* operator new(size_t size) {
//cout << "Allocate " << size << " bytes\n";
s_allocationMetrics.totalMemory += size;
return malloc(size);
}
void operator delete(void* ptr, size_t size) {
//cout << "Deallocate " << size << " bytes\n";
s_allocationMetrics.totalFree += size;
free(ptr);
}
并且在 Functions.h 我创建了这个结构,它跟踪内存分配
struct AllocationMetrics {
uint64_t totalMemory = 0;
uint64_t totalFree = 0;
uint64_t getCurrentUsage() { return totalMemory - totalFree; }
uint64_t maxMem=0;
void setMaxMem() {
uint64_t temp= getCurrentUsage();
if (temp > maxMem)
maxMem = temp;
}
void resetMaxMem() { maxMem = 0; }
};
在 Functions.cpp 的函数中,我需要测量,我调用 setMaxMem,在我的 Benchmark.cpp 中,我调用 resetMaxMem ,在适当的时候。该结构在 Functionc.cpp 中声明,在所有其他 .cpp 文件中它被声明为 extern。
对于这个例子,我在一个循环中 运行 我的基准测试 6x,并且使用 Visual Studio 的 MSVC 我得到了预期的内存结果,以及所有可能的设置(调试、发布等)。
Params: 1063 x 24 5 5 255
Sorting 0.0084792s 0.36439MB
Stripes 0.0179886s 1.64792MB
Params: 1063 x 24 5 5 255
Sorting 0.0080979s 0.364406MB
Stripes 0.0165975s 1.64794MB
Params: 1063 x 24 5 5 255
Sorting 0.0080586s 0.364422MB
Stripes 0.0163024s 1.64795MB
Params: 1063 x 24 5 5 255
Sorting 0.0081503s 0.364438MB
Stripes 0.016274s 1.64797MB
Params: 1063 x 24 5 5 255
Sorting 0.0079747s 0.364454MB
Stripes 0.0170647s 1.64799MB
Params: 1063 x 24 5 5 255
Sorting 0.0079046s 0.364486MB
Stripes 0.0160469s 1.64801MB
当我使用 g++ 编译器 g++ Source.cpp Functionc.cpp benchmarking.cpp
编译相同的代码时,我得到了这些错误的结果
Params: 1063 x 24 5 5 255
Sorting 0.063828s 1.0806MB
Stripes 0.171574s 3.73044MB
Params: 1063 x 24 5 5 255
Sorting 0.061869s 4.32227MB
Stripes 0.172318s 6.97212MB
Params: 1063 x 24 5 5 255
Sorting 0.067859s 7.56395MB
Stripes 0.170573s 10.2138MB
Params: 1063 x 24 5 5 255
Sorting 0.063863s 10.8057MB
Stripes 0.171541s 13.4555MB
Params: 1063 x 24 5 5 255
Sorting 0.062963s 14.0473MB
Stripes 0.170528s 16.6972MB
Params: 1063 x 24 5 5 255
Sorting 0.064827s 17.2891MB
Stripes 0.171541s 19.9389MB
在g++编译中其他一切都是正确的,我尝试了不同的优化级别,这个内存错误没有改变。我使用的是 g++ (MinGW.org GCC-6.3.0-1) 6.3.0 版本。我也试过运行用 clang 来解决这个问题,但出现了同样的错误。
似乎 delete 重载对 g++ 没有影响,或者 delete 在释放时没有被调用变量。 我尝试在 Windows 和 Linux(相同版本的 g++)上编译,这个错误出现在两个版本中。
EDIT1: 忘记了一行带有 temp 定义的代码。
感谢 Jarod42 提出的有用意见。
问题在于 GCC 6.3.0 选择了不同的删除重载,即 delete(void*)
而不是我所针对的 delete(void*, size_t size)
。
为了让 GCC 正常运行,我将其升级到更新的 11.2.0 版本。