2008-11-27 83 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比編譯器本身?