天天看點

linux、memory、memcmp 幾種實作和性能對比

memcmp是最基本的庫函數了。下文選擇幾版代碼,來對比分析性能。

代碼選自linux4.4/lib/string.c

一個byte一個byte的循環比較。c語言的簡潔明了一覽無遺。

代碼選自uksm:https://github.com/dolohow/uksm/blob/master/uksm-4.9.patch

因為是比對page頁面的函數,size是8的整數倍,是以沒有另外判斷。

代碼選自glibc-2.23/sysdeps/x86_64/memcmp.S

以下的代碼是使用彙編語言實作,針對x64的加速,xmm寄存器是16byte寬的,效率更高。

方法1修改一下,單次比較unsigned long的長度。

gcc使用O0,對兩個4k大小的記憶體進行比較,一共比較2G,統計執行時間:

方法1用時大約20S。

方法2用時大約0.64S。

方法3用時大約0.20S。

方法4用時大約2.50S。

方法4的時間是方法1的八分之一左右,這個是預期的邏輯。使用XMM寄存器最快。

gcc使用O2,對兩個4k大小的記憶體進行比較,一共比較2G,統計執行時間:

方法1用時大約3.4S。

方法2用時大約0.62S。

方法4用時大約0.42S。

方法4的時間還是方法1的八分之一左右,但是他們都明顯的縮短了時間,方法4甚至比方法2還要快一些,可見,gcc的優化效果真的好厲害。

真的應了一句話:沒有對比,就沒有傷害。