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

C++ 为什么发布版本memset比visual studio 2012中的调试版本慢?,c++,visual-studio-2012,memset,C++,Visual Studio 2012,Memset,为什么发布版本memset比visual studio 2012中的调试版本慢? 在VisualSutido 2010中,这也是一个结果。 我的电脑: 英特尔酷睿i7-3770 3.40GHz 8G存储器 操作系统: windows 7 sp1 64位 这是我的测试代码: #include <boost/progress.hpp> int main() { const int Size = 1000*1024*1024; char* Data = (char*)ma

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

英特尔酷睿i7-3770 3.40GHz 8G存储器 操作系统: 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;
}
编辑:

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;
}
如果我将代码更改为此,它将得到相同的结果:
#包括
int main()
{
常量int Size=1000*1024*1024;
字符*数据=(字符*)malloc(大小);
memset(数据,1,大小);
#ifdef_调试
printf_s(“调试”);
#否则
printf_s(“发布”);
#恩迪夫
{
boost::进程计时器;
memset(数据,0,大小);
}    
返回0;
}

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

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

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

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


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

这些结果是否可以复制?您多久测试一次?隐藏在这里的是真正的答案:调试分配器填充内存,以避免所有这些页面错误。好样的!
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;
}