基於xor方式交換內存變量內容的研究



/*xor swap確實最消耗時間*/
a     ^= b;
b     ^=a;
a     ^= b;

/*多申請內存時間最快*/   
temp  = b;
b     = a;
a     = temp;

/*加減運算swap時間接近於申請內存,但稍高於基於內存交換的機制*/      
a    += b;
b    = a - b;
a    = a - b;
    
由於在2016年下半年這段時間,經常思及機器的運轉效率以及機器架構一些問題,包括手機系統。近期藉助閒暇,個人很有興趣地研究了下用xor方式可以在不多申請一塊內存的情況下交換兩個內存變量的內容的算法。以前總想着這種基於xor進行交換的算法操作是很優美的,理所應當也應該是效率蠻高的。但後來在網上查閱了下關於xor交換變量的效率分析網文,發現現實還是很骨感的。在網上搜索分析的過程中,觸及到有篇博文基於彙編指令長度的視角,分析xor_swap的性能文章。雖然這篇文章分析的基石有所偏頗,但分析結果卻是對的。對此算法執行效率差異比較大的事實大吃了一驚,便進行了馬後炮式的原因分析,也由此又一次深刻更是是深入理解了計算機系統:)
如果以x86架構的cpu來進行驗證的話,用xor方式進行交換變量應該是最慢的;佔據首位的、最快的,竟然是在內在模型上,也最接近圖靈機運轉機制的多申請一個內存變量以進行交換的算法;榜眼爲add/sub方式。在機理上,基於xor機制和基於add/sub機制以及多一塊內存交換機制三種算法策略,在內存讀寫上是一樣。雖然從基於xor方式和add/sub方式的反彙編代碼,在彙編層次上來看,差別並不大,但卻實際上卻執行相差很遠很遠。由此,不得不懷疑 x86架構的cpu電路層面對於xor的操作支持並不夠友好,xor指令需要耗費更多於add/sub的cpu週期才能完成操作。而基於add/sub方式的運轉效率,幾乎與多申請一塊內存的交換算法相當。雖然自己以前就知道基於寄存器的算法是最快的理論知識,但還是驚訝於這次的實際事實,太太接近了!基於add/sub機制多出來的add/sub運算以及寄存器存取操作,在實際執行上卻幾乎不耗費什麼時間。不得不驚歎於純粹的寄存器運算的快速,以及cpu工作效率與內存工作效率上的巨大差距。

總結下來幾個精華來自於 :1、寄存器算法  2、圖靈機 3、cpu指令執行週期差異

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章