Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/C++memcpu基准:测量CPU和墙壁时间_C++_C_Benchmarking_Memcpy - Fatal编程技术网

C/C++memcpu基准:测量CPU和墙壁时间

C/C++memcpu基准:测量CPU和墙壁时间,c++,c,benchmarking,memcpy,C++,C,Benchmarking,Memcpy,一个基准测试memcpy如何实现?我编写了测试代码,但由于编译器优化,它可能会立即完成,并且实际上不会分配内存: 无效测试无效 { 施工单位32_t尺寸=4000'000'000; 字符a[size],字符b[size]; printfstart\n; forint i=0;i 这个想法是为了测试内存复制是否是通过在CPU参与较少的情况下直接复制RAM中的数据来完成的,CPU参与较少的情况下更可能看到RAM块是否很大,因此该过程不受CPU时间的支配 不,普通计算机上的memcpy不会卸载到DMA

一个基准测试memcpy如何实现?我编写了测试代码,但由于编译器优化,它可能会立即完成,并且实际上不会分配内存:

无效测试无效 { 施工单位32_t尺寸=4000'000'000; 字符a[size],字符b[size]; printfstart\n; forint i=0;i 这个想法是为了测试内存复制是否是通过在CPU参与较少的情况下直接复制RAM中的数据来完成的,CPU参与较少的情况下更可能看到RAM块是否很大,因此该过程不受CPU时间的支配

不,普通计算机上的memcpy不会卸载到DMA引擎,并让CPU做其他事情,直到完成。CPU本身进行复制,因此就操作系统而言,memcpy与用户空间可能运行的任何其他指令没有区别

一个嵌入式系统或C++上的C++实现可以做到这一点,让OS调度另一个任务,或者至少做一些家务。虽然只有非常轻的上下文切换,因为它不需要太长的时间来复制甚至一个巨大的内存块。 一个更简单的方法是单步进入memcpy库函数。是的,随着您的更新,gcc不会优化掉memcpy

除此之外,测试4GiB memcpy并不能代表网络数据包。x86上的glibc memcpy使用不同的策略来存储非常大的拷贝。例如,我假设Linux内核的读/录路径最终使用了copy_to_user,它使用了不同的内存复制函数:希望在x86 CPU上使用ERMS来代表movsbB特征


参见一系列x86内存/缓存性能细节。

微标杆是很难的。幸运的是,谷歌基准测试使它更容易做到。你可以在C++中使用整数文本中的引号来播放一个在线版本吗?我想它们不是,我会从代码中删除它们,使之成为C和C++。如果你想找到一个实际运行程序中的性能问题的来源,你应该使用一个剖析器来找到它,而不是对它的各个部分进行基准。一个剖析器给你在你的代码的每一个部分花费了多少的确切时间。@ unnnv.Maul:这是正确的,40’000是C++,而不是C。在启用优化的情况下编译。您可以使用全局数组+内存屏障(如asm:::内存)来实现这一点,也可以使用GCC-fno内置memcpy。使数组全局化也可以避免自动存储中的大型数组溢出堆栈。@S.V:当您真正的问题是网络数据包时,为什么要计时4GiB memcpy?glibcmemcpy使用不同的策略NT存储非常大的拷贝。我假设Linux内核的读/录路径最终使用copy_to_user,这使用了不同的内存复制函数:希望在x86 CPU上使用ERMSB特性来代表movsb。详细介绍了一系列x86内存/缓存性能细节。