填充内存的非零值比用零填充更慢吗?

时间:2010-03-10 17:37:31

标签: c++ windows visual-studio-2008

我对处理器的工作原理并不是很专业,但可以想象,将内存块设置为零比非零值更容易,因此可能会稍微快一点。

7 个答案:

答案 0 :(得分:8)

我认为唯一的区别在于设置具有存储到内存的值的寄存器。某些处理器的寄存器固定为零(例如ia64)。即便如此,无论设置寄存器的开销微不足道,都会因写入内存而异乎寻常地相形见绌。

就实际写入内存的时间而言 - 我所熟悉的所有架构上的时钟都是相同的。

答案 1 :(得分:3)

理论上,它可能确实更快。

首先,硬件平台可能会提供专用的CPU指令,将内存设置为零。

其次,OS /硬件可能支持将内存设置为零作为 lazy 操作,即实际将内存设置为零的行为除了简单的标记之外并没有真正做任何事情此内存区域在第一次读取时归零。 (当然,只有在OS /硬件级别管理的内存区域才能实现类似的功能。)

后者实际上是calloc函数存在的原因之一:在某些平台上,它可以比仅仅malloc后跟memset更加有效地实现。在这样的平台上,效果将非常大,而不是“边缘”。

答案 2 :(得分:2)

如果对齐缓冲区,PPC可以更快,因为您可以使用dcbz缓存指令。在所有情况下,这都不是你应该依赖的东西。

提到这一点的文章:http://www.ibm.com/developerworks/power/library/pa-memory/index.html

答案 3 :(得分:1)

如果您可以在虚拟内存系统的帮助下完成此操作,则可以比非零页面更快地获得归零(未分配)页面。这种优化通常不会在C ++应用程序中使用(例如标准库实现),所以不要期望在分配一个充满零的std :: vector与其他值之间有任何区别。

答案 4 :(得分:1)

我不知道,因为涉及的因素很多,但找出的方法是两种方式编码并对它们进行基准测试。

值得注意的是,Windows VirtualAlloc函数将新分配的内存初始化为零,尽管Microsoft调试C ++运行时将其重置为虚拟值。如果你想快速获得零初始化内存,那么直接进入操作系统可能是值得的。

答案 5 :(得分:0)

如果存在用于将存储器单元设置为零的cpu指令,则会更快。但没有。

答案 6 :(得分:-1)

英特尔架构上非常常见的优化是使用xor a,b操作,其中两个操作数都是相同的内存位置。这消除了在寄存器中存储值并执行移动操作的任何需要。因此,如果库使用此优化,则写入零会更快。

我必须纠正自己,只有两个操作数都注册,然后才使用XOR。