2008-11-27 50 views
22

在什么情况下,我应该期望memcpys在现代INTEL/AMD硬件上的性能优于任务?我在32位英特尔平台上使用GCC 4.2.x(但我也对64位感兴趣)。memcpy vs C中的赋值

+0

有趣的问题!正如你明显担心如何提高内存操作的速度:最近我从有人开发pyTables中了解了压缩在内存传输中的作用:http://www.pytables.org/docs/StarvingCPUs.pdf如上所述, memcpy的通常使用可能会比使用非常快的压缩器([blosc](http://blosc.pytables.org/trac/))的速度更慢。 请仅将此作为高性能的东西! – math 2012-03-20 19:48:38

+0

这个问题相当广泛。 – 2014-09-09 19:32:50

回答

33

你永远不应该期望他们超越任务。原因是,编译器无论如何都会使用memcpy,因为它认为它会更快(如果使用优化标志)。如果不是,并且如果该结构适合寄存器的合理小,则可以使用直接寄存器操作,其根本不需要任何存储器访问。

GCC内部具有特殊的块移动模式,可以指出何时直接更改寄存器/存储器单元或何时使用memcpy函数。请注意,在分配结构时,编译器在编译时知道移动的大小,因此它可以展开小的副本(例如在行中进行n次移动而不是循环移动)。注-mno-memcpy

-mmemcpy 
-mno-memcpy 
    Force (do not force) the use of "memcpy()" for non-trivial block moves. 
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies. 

谁更好知道它何时使用memcpy比编译器本身?