關於在c/c++中如何寫乙個swap函式,最直接的方法就是用臨時變數
void swap_tempvariable(int &a, int &b)
//用算術的方法調換a,b的值
void swap_arithmetic(int &a, int &b)
//用位運算的方法調換a,b的值
void swap_bit(int &a, int &b)
後兩種方法相對於第一種,少定義了乙個臨時變數,而且語句也只有3條,看起來在時間上和空間上都進行了優化。但結果是這樣的嗎?我們用gtest來測試一下,每個函式執行10000次,看看消耗了多少時間
#include"gtest/gtest.h"
#include
void swap_tempvariable(int &a, int &b)
void swap_arithmetic(int &a, int &b)
void swap_bit(int &a, int &b)
long getcurrentutime()
class lexquicktest : public testing::test
virtual void teardown()
long start_time_;
};test_f(lexquicktest, swap_tempvariable)
}test_f(lexquicktest, swap_arithmetic)
}test_f(lexquicktest, swap_bit)
}我們來看看執行的效果,太(cai)棒(ni)了(mei),和我們想的不一樣,使用臨時變數的方法,執行花費了105us(請自動忽視gtest的1ms,因為us的單位太小,這個ms是隨機的), 而其他兩種方法分別花費了161us和167us. 多花了將近60%的時間 (經過多次測試,用臨時變數的方法,執行的時間是變化,具體原因不詳,但效率比後面兩種方法高是肯定的)
[**********] running 3 tests from 1 test case.
[----------] global test environment set-up.
[----------] 3 tests from lexquicktest
[ run ] lexquicktest.swap_tempvariable
the test take105us.[ ok ] lexquicktest.swap_tempvariable (1 ms)
[ run ] lexquicktest.swap_arithmetic
the test take161us.[ ok ] lexquicktest.swap_arithmetic (0 ms)
[ run ] lexquicktest.swap_bit
the test take167us.[ ok ] lexquicktest.swap_bit (0 ms)
[----------] 3 tests from lexquicktest (1 ms total)
[----------] global test environment tear-down
[**********] 3 tests from 1 test case ran. (1 ms total)
[ passed ] 3 tests
為什麼會這樣,只有把彙編**打出來看看了(用以下方法,需要定義乙個main函式)
gcc swap.cc -g
objdump -ds a.out
00000000004004ec <_z17swap_tempvariableris_>:
void swap_tempvariable(int &a, int &b)
400516:5d pop %rbp
400517:c3 retq
0000000000400518 <_z15swap_arithmeticris_>:
void swap_arithmetic(int &a, int &b)
400560:5d pop %rbp
400561:c3 retq
0000000000400562 <_z8swap_bitris_>:
void swap_bit(int &a, int &b)
4005aa:5d pop %rbp
4005ab:c3 retq
很明顯,後兩種方法生成了更多的**,用了更多的暫存器,而且呼叫了更費時彙編操作。而收益僅僅是在棧上少用了點點空間。。。有意思麼
Ansible之優化提公升執行效率
今天分享一下ansible在工作環境中有那些可以優化的配置 環境介紹 以前在公司工作處理伺服器問題,需要用批量操作都是用shell指令碼編寫的工具,後來發現ansible這個自動化工具,安裝簡單,操作起來很方便,支援多個模組,由python開發基於ssh協議通訊的工具。這裡有個問題就是如果伺服器越來...
面試總結之C 類預設預設函式
一 編譯器定義的預設預設函式 編譯器會為每乙個類產生六個預設函式 建構函式 拷貝建構函式 析構函式 賦值運算子過載 取位址運算子過載 取位址運算子過載 const版 這六個函式的實現如下 demo demo 預設建構函式 demo demo 析構函式 demo demo operator 取址運算子...
C 面試之main函式之後的呼叫
main函式代表程序的主線程。程式開始執行時,系統為程式建立乙個程序,main函式其實並不是首先被呼叫的函式,而是作業系統呼叫了c c 執行期啟動函式,該函式負責對c c 執行期庫初始化。它還能保證已經宣告了的任何全域性物件和靜態物件能夠在 執行之前正確的建立。完成這些工作後,就呼叫進入點函式 控制...