因此,無論何時編寫代碼,我都會考慮性能問題。我經常想知道,在性能方面使用memcopy相對於其他函數的「成本」是多少?C/C++中Memcopy的性能代價
例如,我可能會寫一個數字序列到一個靜態緩衝區,並專注於緩衝區內的一個幀,爲了保持幀一旦我到達緩衝區的末尾,我可能記憶所有它或者我可以實現一個算法來分攤計算。
因此,無論何時編寫代碼,我都會考慮性能問題。我經常想知道,在性能方面使用memcopy相對於其他函數的「成本」是多少?C/C++中Memcopy的性能代價
例如,我可能會寫一個數字序列到一個靜態緩衝區,並專注於緩衝區內的一個幀,爲了保持幀一旦我到達緩衝區的末尾,我可能記憶所有它或者我可以實現一個算法來分攤計算。
memcpy通常經過優化以最大化大容量拷貝的內存帶寬。當然,它不像完全避免拷貝一樣快,對於固定大小的簡短拷貝,直接分配可能會更快,因爲memcpy有額外的代碼來處理奇數長度。
但是當你需要複製一塊內存時,很難擊敗memcpy。它非常便於攜帶,大多數編譯器都會竭盡全力使其變得更快,無論是使用SIMD指令還是內聯。
應該避免在C++中使用memcpy,因爲它是一個「啞巴」的副本,並可能導致不好的結果。賦值運算符/拷貝構造函數應該可選地使用。另外,應首先運行配置文件以確定問題所在。 – Puppy 2010-06-13 16:41:55
@DeadMG:許多C++程序都是在「啞」數據上工作的,這些數據被C++標準稱爲「普通舊數據」,並且在使用memcpy時非常安全。根據我的經驗,沒有POD的程序類型是用更高級的語言寫得更好的程序。 – 2010-06-13 16:53:50
是的。你*可以*使用memcpy,並完全將程序與非POD類型一起使用。或者,你可以使用賦值運算符,它最終將產生一個用於POD類型的memcpy和一個適用於非POD類型的程序。 – Puppy 2010-06-13 17:48:45
嗯,首先 - 你應該想想性能只有當內存複製是你瓶頸(它真的難得一遇)。
其次,memcpy
是使用匯編器(見memcpy.asm
)實現的,我猜是最快的內存複製解決方案。
另外要提到的是,一般原始的memcpy
在C++中的調用應該避免,試着使用更抽象的包裝和例程。
可以使用CPU寄存器實現簡單分配,但memcpy的使用不是這種情況。如果分配過大,則編譯器會回退到memcpy,所以更好地使用分配(如果適用...) – MindTailor 2013-06-27 13:49:10
memcpy()
將源中的存儲器內容複製到dest。顯然,複製與源中元素的數量成線性關係。什麼構成元素的最佳尺寸是機器依賴性。無論如何,很多編譯器otimization黑魔法可以應用,取決於操作的上下文。在C++中,避免memcpy
並使用賦值或複製構造函數通常更爲明智。
在現代體系結構中,考慮到內存體系結構和高速緩存效應,幾乎可以肯定地複製不是線性的到元素的數量。 memcpy和copy構造函數比較蘋果和桔子。 – 2012-01-10 20:58:06
可以考慮性能影響,但不要過分注意編寫乾淨的代碼的真正目標。如果即使您知道的更好,您也傾向於關注性能,請嘗試關注更高級別的含義,並忽略諸如memcpy
之類的點點滴滴,您可以信任編譯器和庫作者進行優化。
通常避免提前優化這種低級類型,因爲它消耗您的時間,影響會影響整個程序,並且如果沒有測量,您就無法期望獲得任何性能提升。
考慮麥考密克的「代碼完成」一書。從那裏無恥地偷竊---
算法改進通常在性能方面有最大的回報。
簡單語句允許編譯器進行有效優化。這些程序員成本很低。他們通常會提高可讀性。無論如何,它們是低成本的默認「應該」。
如前所述memcpy
已經調整和往往是在更大的內存塊確實有效。那麼爲什麼要避免它,如果情況決定保持數據?
一般不會無故優化。假設您針對大量數據集編寫報告。沒有用戶期望在這種情況下有即時響應。他們開始工作,去吃點心。因此,如果您的代碼在10分鐘或3分鐘內運行,則無關緊要。 給他們。 Thet不會注意到。而且......他們寫你的薪水。
程序員優化是一個巨大的前期成本。所以只在需要的地方花費這筆費用。
其實,它是史蒂夫麥克康德的代碼完整 – 2010-06-13 16:44:05
它是麥康奈爾。我立場糾正。 – 2010-06-13 20:39:13
你有沒有超越性能考慮和衡量它? – 2010-06-13 16:00:25
我有,但不是爲了memcopy。 – Cenoc 2010-06-13 16:02:19
總是考慮性能是編寫蹩腳(也許很慢)代碼的好方法。 – 2010-06-13 16:11:09