为什么发布版memset比调试版慢
why the release version memset is slower than debug version in visual studio 2012?
为什么发布版本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()的成本。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 在linux上调试巨大的C++项目
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 正在VS调试器中监视映射条目
- 使用调试/崩溃报告将应用程序部署到客户端
- VC++本机单元测试,找不到调试符号
- 如何在C++生成器中禁用"使用调试.dcus"
- C++中的memset函数工作不正常
- 使用vscode调试时,GDB意外退出
- 即使使用调试编译标志,表达式也是"optimized out"
- 调试 CUDA MMU 故障
- 小字符串优化(调试与发布模式)
- 调试和自由执行中的信号处理
- 调试编译的服务器在数据库打开时崩溃
- Visual Studio 调试优化如何工作?
- 如何配置Visual Studio Code以使用cygwin,cmake和gcc进行调试
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何在大型c++项目的可视化代码中设置调试
- 为什么发布版memset比调试版慢