【发布时间】:2021-03-13 23:55:49
【问题描述】:
我注意到memcpy 在 Linux 上比在相同硬件上的 Windows 上更快。我使用 Intel i7 4770 CPU 和 16Gb RAM 双启动相同的机器并运行相同的编译 C++ 代码。我正在尝试使用此代码来代替memccpy
#include <iostream>
#include <chrono>
#include <cstring>
typedef std::chrono::high_resolution_clock Clock;
int main() {
const int mb = 300;
int size = mb * 1024 * 1024 / sizeof(int);
auto buffer = new int[size];
srand(1);
for(int i = 0; i < size; i++) {
auto r = abs(rand()) % 2048;
buffer[i] = std::max<int>(r, 1);
}
auto buffer2 = new int[size];
const int repeats = 100;
for (int j = 2; j < mb; j+=2) {
auto start = Clock::now();
// Copy j Mb
int size = j * 1024 * 1024 / sizeof(int);
for (int i = 0; i < repeats; i++) {
int offset = 0;
while (offset < size) {
// Run memcpy on random sizes
int copySize = buffer[offset];
memcpy(buffer2, buffer, copySize * sizeof(int));
offset += copySize;
}
}
auto end = Clock::now();
auto diff = std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count();
// Time taken per 1Mb
std::cout << j << "," << diff / j / repeats << std::endl;
}
}
Linux 执行速度平均快 10%。在 Linux 上平均需要 20 微秒/Mb,在 Windows 上平均需要 22 微秒/Mb。它在两种情况下都使用 gcc 10.2 m64 -O3 -mavx 标志编译。我正在处理的项目是 OS 数据库,在那里我发现 memcpy 和 memset 在 Linux 上的速度更快,小缓冲区的随机长度副本的速度提高了大约 30%。
知道为什么 Windows 上的 memcpy 与 Linux 不同吗?我希望memcpy 是用汇编语言编写的,不依赖于操作系统,只依赖于 CPU 架构。
【问题讨论】:
-
这两个操作系统有不同的
memcpy()实现,显然Linux(嗯,glibc)优化得更好。或者还有其他问题会影响您的基准测试时间(实际 CPU 时间比挂钟时间更好)。
标签: linux windows glibc questdb