我注意到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.2m64 -O3 -mavx
标志编译。我正在从事的项目是 OS 数据库,在那里我看到了更大的影响 memcpy 和 memset 在 Linux 上更快,在小缓冲区的随机长度副本上加速了大约 30%。
知道为什么memcpy
在 Windows 上与 Linux 不同吗?我希望它memcpy
是用汇编语言编写的,不依赖于操作系统,而只依赖于 CPU 架构。