C 面試之函式執行效率

2021-06-22 18:16:18 字數 2386 閱讀 7085

關於在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 執行期庫初始化。它還能保證已經宣告了的任何全域性物件和靜態物件能夠在 執行之前正確的建立。完成這些工作後,就呼叫進入點函式 控制...