为什么发布版memset比调试版慢

why the release version memset is slower than debug version in visual studio 2012?

本文关键字:调试 memset 布版 为什么      更新时间:2023-10-16

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

Intel Core i7-3770 3.40GHz8 g的内存操作系统:Windows 7 sp1 64bit

这是我的测试代码:
#include <boost/progress.hpp>
int main()
{
    const int Size = 1000*1024*1024;
    char* Data = (char*)malloc(Size);
#ifdef _DEBUG
    printf_s("debugn");
#else
    printf_s("releasen");
#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("debugn");
#else
    printf_s("releasen");
#endif
    {
        boost::progress_timer timer;
        memset(Data, 0, Size);
    }    
    return 0;
}

所以汉斯·帕桑特是对的,非常感谢。

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

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

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

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