用异或来交换两个变量能提快速度是错误的
生活随笔
收集整理的這篇文章主要介紹了
用异或来交换两个变量能提快速度是错误的
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在進行兩個變量的時候,常常會看到有些書誤人子弟的推薦使用異或的方式: 方式一 {
? x = x ^ y; y = x ^ y; x = x ^ y; } 而不是採用暫時變量實現交換: 方式二 { int temp; temp = a; ? ?? a = b; b = temp; } 美其名曰:節省內存,提高執行速度。 暫時變量交換的方式:
可是,真的節省了內存嗎? 使用這樣的方式大部分時候,沒有節省內存。由于。普通情況下編譯器會將方式二中的暫時變量優化到寄存器中,不使用堆棧。
真的提高了執行速度嗎? 下邊的博客給出了非常具體的解答。 http://blog.csdn.net/do2jiang/article/details/4549679 http://blog.csdn.net/solstice/article/details/5166912 因為方式一,每一次運行都會多進行三次異或運算。
關于優化: http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/1224/11834.html “過早的優化是萬惡之源”,當我們沒有確定程序影響性能最重要的20%代碼時,最好不要進行優化。同一時候。在優化時,不要過于相信經驗。由于CPU技術,編譯技術。操作系統等等。都會讓看似可行的技術,失效。 在優化前,通過實際的執行確定影響性能的代碼,然后進行優化。
最后。從軟件project的角度看,代碼是寫給人看的。最easy理解的代碼,被維護的代價也最小。方式二的代碼更easy閱讀。
結語: 編譯器非常強大,CPU技術進步非常快,我們的經驗積累反而是最慢的。
附注: 假設要作為面試題。交換一個32位無符號整形數的方案,倒是更能夠考慮一下採用位運算的方式解決。
? x = x ^ y; y = x ^ y; x = x ^ y; } 而不是採用暫時變量實現交換: 方式二 { int temp; temp = a; ? ?? a = b; b = temp; } 美其名曰:節省內存,提高執行速度。 暫時變量交換的方式:
可是,真的節省了內存嗎? 使用這樣的方式大部分時候,沒有節省內存。由于。普通情況下編譯器會將方式二中的暫時變量優化到寄存器中,不使用堆棧。
真的提高了執行速度嗎? 下邊的博客給出了非常具體的解答。 http://blog.csdn.net/do2jiang/article/details/4549679 http://blog.csdn.net/solstice/article/details/5166912 因為方式一,每一次運行都會多進行三次異或運算。
又因為方式一的代碼,在編譯器理解起來。可能比較困難所以編譯器翻譯出來的代碼,運行效率更低。
關于優化: http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/1224/11834.html “過早的優化是萬惡之源”,當我們沒有確定程序影響性能最重要的20%代碼時,最好不要進行優化。同一時候。在優化時,不要過于相信經驗。由于CPU技術,編譯技術。操作系統等等。都會讓看似可行的技術,失效。 在優化前,通過實際的執行確定影響性能的代碼,然后進行優化。
最后。從軟件project的角度看,代碼是寫給人看的。最easy理解的代碼,被維護的代價也最小。方式二的代碼更easy閱讀。
結語: 編譯器非常強大,CPU技術進步非常快,我們的經驗積累反而是最慢的。
多反思,多總結。
附注: 假設要作為面試題。交換一個32位無符號整形數的方案,倒是更能夠考慮一下採用位運算的方式解決。
總結
以上是生活随笔為你收集整理的用异或来交换两个变量能提快速度是错误的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017-05-23 前端日报
- 下一篇: SqlSessionFactoryBui