gpt4 book ai didi

c++ - 为什么发布版本 memset 比 visual studio 2012 中的调试版本慢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:02 27 4
gpt4 key购买 nike

为什么在 visual studio 2012 中发布版本的 memset 比调试版本慢?在 visual sutido 2010 中,也是这个结果。我的电脑:

英特尔酷睿 i7-3770 3.40GHz8G内存操作系统: Windows 7 SP1 64 位

这是我的测试代码:

#include <boost/progress.hpp>

int main()
{
const int Size = 1000*1024*1024;
char* Data = (char*)malloc(Size);

#ifdef _DEBUG
printf_s("debug\n");
#else
printf_s("release\n");
#endif

boost::progress_timer timer;
memset(Data, 0, Size);

return 0;
}

输出:

release
0.27 s

debug
0.06 s

编辑:

if i change code to this, it will get the same result:

#include <boost/progress.hpp>

int main()
{
const int Size = 1000*1024*1024;
char* Data = (char*)malloc(Size);
memset(Data, 1, Size);

#ifdef _DEBUG
printf_s("debug\n");
#else
printf_s("release\n");
#endif

{
boost::progress_timer timer;
memset(Data, 0, Size);
}

return 0;
}

所以 Hans Passant 是对的,非常感谢。

最佳答案

这是一个标准的基准测试错误,您根本没有测量 memset() 的执行时间。您实际上测量了操作系统处理您的代码生成的四分之一百万页错误所需的时间。这在很大程度上取决于正在运行的其他进程以及内核的零页线程准备了多少页。

在像 Windows 这样的请求页虚拟内存操作系统上,malloc() 根本不分配内存。它分配地址空间。只是处理器的数字。在处理器访问地址空间之前,物理内存分配不会发生。此时内核被迫提供物理 RAM 以允许处理器继续运行。由处理器在发现地址尚未映射到 RAM 时生成的软页面错误触发。

如果您想估计 memset() 真正 需要多长时间,那么您必须调用它两次。第一次调用确保 RAM 已映射。计时第二次调用以测量内存写入需要多长时间。对于像您正在使用的大内存范围,这是一个固定数字,内存缓存和回写缓冲区无效,因此速度完全由内存总线的带宽决定。您的调试结果表明 DDR3 的时钟频率为 266 MHz,这很常见。

这也消除了在 CRT 的调试版本中使用调试分配器所带来的偏见。当您尝试访问未初始化的内存时,它会使用可能导致崩溃的位模式填充分配的内存。这隐藏了页面错误开销,因为您没有在测量中包括 malloc() 的成本。

关于c++ - 为什么发布版本 memset 比 visual studio 2012 中的调试版本慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24057825/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com