memcpy比迴圈賦值快嗎?為什麼?

時間 2021-05-05 16:55:23

1樓:sda1

我覺得可以看看韋易笑老師的文章:

記憶體拷貝優化(1)-小記憶體拷貝優化

記憶體拷貝優化(2)-全尺寸拷貝優化 - Skywind Inside記憶體拷貝優化(3)-深入優化 - Skywind InsideUsing Block Prefetch for Optimized Memory Performance

2樓:zjw

考慮到一堆神佬在做的標準庫水平,除非你真的情況太特殊,不然真的比迴圈快,標準庫的針對環境優化人家是完全有理由寫進編譯器的,這種親兒子體驗恐怕你的迴圈享受不到

3樓:co lin

你說的標準庫實現是不是從所以,對於這些基礎庫函式,除非你的水平真的極高,否則應該總是認為它們的實現會比你自己的快。就像有些人會去折騰spinlock的實現,真往往都沒有系統提供的快一樣。

4樓:猿某人

不一定。

一般說法是memcpy是彙編實現的,所以快。

然鵝,編譯器開優化後,底層與memcpy沒區別,甚至可能因為一些中間值不用計算,執行更快。

大多數情況下,我是不建議是用這個函式的,這個太底層了,要求開發者準確了解資料的記憶體結構,而通常我們沒必要手工優化。

5樓:

題外話,其實std::copy還快那麼一丟丟,至少不會比memcpy差,原因是memcpy在void*上,少了一丟丟資訊,比如傳乙個std :: uint64_t的陣列,std::

copy能對這種連續記憶體的陣列,做更好的對齊逃(

6樓:深邃暗黑范特西

1.書上的迴圈例子沒有做迴圈展開,當然沒法應用x86 cpu的流水線優化

2.標準庫的memcpy經過了SSE指令集的優化,自然比單純迴圈賦值快的多

7樓:開心小小喵

你看的是哪個標準庫實現?現實現在都有針對不同cpu架構優化的,比如gcc吧,sysdeps目錄下面有幾十種針對不同cpu架構的優化。具體要依賴不同cpu的提供的硬體指令。

8樓:張浩

除了各位提到的simd, 在支援dma的平台上可以用dma優化. cpu需要做的只是告訴dma控制器, 源位址, 目的位址, 需要copy多少個、多少位寬的資料, 開始傳輸,等著完事。

單論傳輸時間不一定比直接賦值快(可能慢不少),但是在等待dma控制器那邊說「傳完了」的這段時間, cpu可以並行去幹別的事了,總的來說還是快的。

Linux伺服器(x86架構),想用DMA做memcpy,就是用DMA做記憶體到記憶體的拷貝,可以實現嗎?

還有這個:

怎樣寫出乙個更快的 memset/memcpy ?

9樓:

現在的回答都是什麼鬼,為什麼都沒有提到simd?

明確回答:

memcpy(一般情況下)就是比迴圈賦值快,因為libc中它的實現一般都會使用simd指令。你可以想象成,你的迴圈賦值每次拷貝乙個值,而它每次可能拷貝4,8,16或者更多個值。

然而,(一般情況下),在開啟了足夠高等級的優化之後(例如GCC可能需要開啟-O3優化),編譯器會自動把迴圈賦值優化成memcpy,只要它可以證明這二者效果是等價的。

關於什麼叫「等價」,可以給兩個簡單的例子:

// 不等價

void

copy1

(char*a

,const

char*b

,size_t

len)

}// 等價

void

copy2

(char

*__restrict__a,

const

char

*__restrict__b,

size_t

len)}

10樓:逐光者

有好多人都在想當然的說啊。。核心在於memcpy是呼叫了simd指令按processor word的長度做copy的,比如乙個processor word是128bit的話,就直接copy記憶體中連續的128個bits,比按int32或者int16的長度迴圈遍歷copy自然會快一些。

我測過自己寫的用simd指令迴圈遍歷copy,和memcpy是一樣的速度。

11樓:

c語言只是對組合語言進行抽象而已,更具體說,c語言的實現依賴於特定組合語言。

所以,memcpy為什麼快?想要理解這個可以先通過組合語言,比如x86彙編或者riscv實現一下memcpy的函式,看看彙編層面是如何操控記憶體的?然後再考慮下c語言中的迴圈在彙編層面是怎麼實現的?

彙編中對記憶體的操控是否一定需要迴圈?這些想清楚對c語言的理解就水到渠成了

12樓:豬蹄醬

通常libc的memcpy會針對不同平台進行彙編優化,不過一般無需考慮效能差別,編譯器開優化選項後,普通迴圈也經常會被編譯器進行SIMD之類的優化。

13樓:Hengrui Zhang

具體其實要看編譯器的實現

很多實現中memcpy是一次賦值好幾個的,當然比你直接迴圈快一點

其實就算只是最簡單的指標迴圈賦值,在不考慮編譯器優化的情況下,也比普通迴圈快一點點

眼神的速度比光速快嗎?

小咖啡 在整個相對論 廣義相對論 中,粒子的區域性速度是絕不會超光速的 所謂 粒子的區域性速度 其定義就是,該粒子世界線鄰域慣性觀測者測得的 固有距離 除以 觀測者手中表記出的時間 上述操作能實現,是由強等效原理 SEP 保證的,因為時空區域性可採用平直時空逼近,因此可建立區域性慣性系 從物理上講,...

女性比男性老得快,但比男性活得長?真的嗎?

朱耀華 知乎流行的說法 1 先問是不是,再問為什麼。2 倖存者偏差。1 女人是不是比男人老得快?不是,除了生育能力 女人五十已沒戲,男人六十也當爸 沒資料顯示女人比男人老得快。2 如果是見老婦比老爺多,這更明顯是因為老爺早歸西,所以見的老婦多! 瘋烏鴉 學術性的回答是不可能的 我這樣的普通人哪分的清...

冥想時數數比呼吸快可以嗎

知白守黑 數數就是為了數呼吸啊,數呼吸是為了一念代萬念,對治雜念散亂的其中一種方法。數數哪能和呼吸分開呢。有乙個訣竅,數呼吸時隻數呼氣,忘記吸氣,呼為陽。你試試,效果截然不同。 淨海潮水 首先,師兄你說的,數數比呼吸快,用手按摩眼睛,這種方法很不妥。對冥想很有經驗的人士,或許可能。要一心,要心一境性...