1. 程式人生 > >提高C++程式執行效率的10個簡單方法

提高C++程式執行效率的10個簡單方法

本文以C/C++程式為例講述了程式執行效率的10個簡單方法,分享給大家供大家參考之用。具體分析如下:

對於每一個程式設計師來說,程式的執行效率都是一個值得重視,併為之付出努力的問題。但是程式效能的優化也是一門複雜的學問,需要很多的知識,然而並不是每個程式設計師都具備這樣的知識,而且論述如何優化程式提高程式執行效率的書籍也很少。但是這並不等於我們可以忽略程式的執行效率,下面就介紹一下本人積累的一些簡單實用的提高程式執行效率的方法,希望對大家有所幫助。

一、儘量減少值傳遞,多用引用來傳遞引數。
至於其中的原因,相信大家也很清楚,如果引數是int等語言自定義的型別可能能效能的影響還不是很大,但是如果引數是一個類的物件,那麼其效率問題就不言而喻了。例如一個判斷兩個字串是否相等的函式,其宣告如下:

?
1234boolCompare(string s1, string s2)boolCompare(string *s1, string *s2)boolCompare(string &s1, string &s2)boolCompare(conststring &s1, conststring &s2)

其中若使用第一個函式(值傳遞),則在引數傳遞和函式返回時,需要呼叫string的建構函式和解構函式兩次(即共多呼叫了四個函式),而其他的三個函式(指標傳遞和引用傳遞)則不需要呼叫這四個函式。因為指標和引用都不會建立新的物件。如果一個構造一個物件和析構一個物件的開銷是龐大的,這就是會效率造成一定的影響。

然而在很多人的眼中,指標是一個惡夢,使用指標就意味著錯誤,那麼就使用引用吧!它與使用普通值傳遞一樣方便直觀,同時具有指標傳遞的高效和能力。因為引用是一個變數的別名,對其操作等同於對實際物件操作,所以當你確定在你的函式是不會或不需要變數引數的值時,就大膽地在宣告的前面加上一個const吧,就如最後的一個函式宣告一樣。

同時加上一個const還有一個好處,就是可以對常量進行引用,若不加上const修飾符,引用是不能引用常量的。

二、++i和i++引申出的效率問題

看了上面的第一點,你可能覺得,那不就是多呼叫了四個函式而已,你可能對此不屑一顧。那麼來看看下面的例子,應該會讓你大吃一驚。

至於整型變數的前加和後加的區別相信大家也是很清楚的。然而在這裡我想跟大家談的卻是C++類的運算子過載,為了與整形變數的用法一致,在C++中過載運算子++時一般都會把前加和後加都過載。你可能會說,你在程式碼中不會過載++運算子,但是你敢說你沒有使用過類的++運算子過載嗎?迭代器類你總使用過吧!可能到現在你還不是很懂我在說什麼,那麼就先看看下面的例子吧,是本人為連結串列寫的一個內部迭代器。

?
1234567891011_SingleList::Iterator& _SingleList::Iterator::operator++()//前加{pNote = pNote->pNext;return*this;}_SingleList::Iterator _SingleList::Iterator::operator++(int)//後加{Iterator tmp(*this);pNote = pNote->pNext;returntmp;}

從後加的實現方式可以知道,物件利用自己建立一個臨時物件(自己在函式呼叫的一個複製),然後改變自己的狀態,並返回這個臨時物件,而前加的實現方式時,直接改變自己的內部狀態,並返回自己的引用。

從第一點的論述可以知道後加實現時會呼叫複製建構函式,在函式返回時還要呼叫解構函式,而由於前加實現方式直接改變物件的內部狀態,並返回自己的引用,至始至終也沒有建立新的物件,所以也就不會呼叫建構函式和解構函式。

然而更加糟糕的是,迭代器通常是用來遍歷容器的,它大多應用在迴圈中,試想你的連結串列有100個元素,用下面的兩種方式遍歷:

?
123456789for(_SingleList::Iterator it = list.begin(); it != list.end(); ++it){//do something}for(_SingleList::Iterator it = list.begin(); it != list.end(); it++){//do something}

如果你的習慣不好,寫了第二種形式,那麼很不幸,做同樣的事情,就是因為一個前加和一個後加的區別,你就要呼叫多200個函式,其對效率的影響可就不可忽視了。

三、迴圈引發的討論1(迴圈內定義,還是迴圈外定義物件)

請看下面的兩段程式碼:

程式碼1:

?
123456ClassTest CT;for(inti = 0; i < 100; ++i){CT = a;//do something}

程式碼2:

?
12345for(inti = 0; i < 100; ++i){ClassTest CT = a;//do something}

你會覺得哪段程式碼的執行效率較高呢?程式碼1科學家是程式碼2?其實這種情況下,哪段程式碼的效率更高是不確定的,或者說是由這個類ClassTest本向決定的,分析如下:

對於程式碼1:需要呼叫ClassTest的建構函式1次,賦值操作函式(operator=)100次;對於程式碼2:需要高用(複製)建構函式100次,解構函式100次。

如果呼叫賦值操作函式的開銷比呼叫建構函式和解構函式的總開銷小,則第一種效率高,否則第二種的效率高。

四、迴圈引發的討論2(避免過大的迴圈)

現在請看下面的兩段程式碼,
程式碼1:

?
12

相關推薦

VC++ 提高C++程式執行效率10簡單方法(其他語言程式參考)

對於每一個程式設計師來說,程式的執行效率都是一個值得重視,併為之付出努力的問題。但是程式效能的優化也是一門複雜的學問,需要很多的知識,然而並不是每個程式設計師都具備這樣的知識,而且論述如何優化程式提高程式執行效率的書籍也很少。但是這並不等於我們可以忽略程式的執行效率,下面

提高C++程式執行效率10簡單方法

本文以C/C++程式為例講述了程式執行效率的10個簡單方法,分享給大家供大家參考之用。具體分析如下:對於每一個程式設計師來說,程式的執行效率都是一個值得重視,併為之付出努力的問題。但是程式效能的優化也是一門複雜的學問,需要很多的知識,然而並不是每個程式設計師都具備這樣的知識,

提高程式執行效率10簡單方法

對於每一個程式設計師來說,程式的執行效率都是一個值得重視,併為之付出努力的問題。但是程式效能的優化也是一門複雜的學問,需要很多的知識,然而並不是每個程式設計師都具備這樣的知識,而且論述如何優化程式提高程式執行效率的書籍也很少。但是這並不等於我們可以忽略程式的執行效率,下

C++程式設計中提高程式執行效率的方式(不斷更新)

在實際的工作中,利用程式實現同樣的功能會有很多種方式,但是考慮到程式的執行時間時,很多方式並不可取。不斷提高程式的執行效率,而又不影響程式功能是程式設計師的不竭追求! 以下是我在工作中總結的提高程式程式碼效率的方式: 1.整型執行速度快於浮點型,所以能用整型的地方儘量不要

Spring JPA使用時,提高程式執行效率的幾點總結

1, 在刪除操作時,最好不要用jpa,直接在dao方法上@query,也就是用sql語句,能快些:jpa實現刪除需要@transaction註解,該註解有可能造成tomcat出問題。。而且改成@query可以提升速度 2,sql中去掉trim 改java實

c++ 運算執行效率提高技巧

儘量避免使用值傳遞,推薦使用const 引用來傳遞引數 臨時變數的代價。 迴圈體中的區域性變數,儘量在迴圈體內定義  複製操作與構造解構函式的代價差異。  避免過大的迴圈 cache的時間侷限性和空間侷限性 時間侷限性:如果一個儲存單元被訪問,則可能該單元會很快再次被訪問,因

C#程式(含多Dll)合併成一個Exe的超簡單方法

開發程式的時候經常會引用一些第三方的DLL,然後編譯生成的exe檔案就不能脫離這些DLL獨立運行了。 但是,很多時候我們本想開發一款只需要一個exe就能完美執行的小工具。那該怎麼辦呢? 下文介紹一種超簡單的方法,不用寫一行程式碼就可輕鬆實現。 這裡我們需要用到一款名為Fody.Costura的工具。Fo

golang 利用閉包來獲取一段程式執行效率時間,很簡單但是很經典

... func main(){ duration:=GetDuration(func(){ //do sth resp, err2 = client.Do(req)

c++類編程的兩簡單的例子

function pointer efi AI == TP 數據 IT empty 關於棧的數據結構:類的頭文件定義 // stack.h -- class definition for the stack /*****************

Linux C 程式執行 shell 命令並獲取返回結果的方法

據說有統計資料表明,程式碼的缺陷率是一定的,與所使用的語言無關。Linux提供了很多的實用工具和指令碼,在程式中呼叫工具和指令碼,無疑可以簡化程式,從而降低程式碼的缺陷數目。Linux shell 指令碼也是一個強大的工具,我們可以根據需要編制指

JAVA多執行10執行緒處理1000個數據

import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import j

C++程式執行時間

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<ctime> using

C# 程式執行中的流程控制

1、C#之流程控制語句:計算機程式執行的控制流程由三種基本的控制結構控制,即順序結構,選擇結構,迴圈結構。 1) 順序結構:從上到下,按照書寫順序執行每一條語句,不會發生跳躍。 程式碼段1; // 先執行程式碼段1 程式碼段2; // 接著執行程式碼段2 ... 2)選擇結構:對

提高Python程式效能的七習慣

Python在效能方面不卓越,但是使用一些小技巧,可以提高Python程式的效能,避免不必要的資源浪費。 1. 使用區域性變數 儘可能使用區域性變數替代全域性變數,可以是程式易於維護並且有助於提高效能節約成本。 在模組名稱空間中將變數替換為區域性變數,例如ls = os.linesep。

c/c++ 多執行緒 多執行緒等待同一個執行緒的一次性事件

多執行緒 多個執行緒等待一個執行緒的一次性事件 背景:從多個執行緒訪問同一個std::future,也就是多個執行緒都在等待同一個執行緒的結果,這時怎麼處理。 辦法:由於std::future只能被呼叫一次get方法,也就是隻能被某一個執行緒等待(同步)一次,不支援被多個執行緒等待。所以std::shar

WebDriverWait智慧等待查詢元素,提高程式碼的執行效率,不浪費時間,減少程式碼量

from selenium.webdriver.support.wait import WebDriverWait智慧等待10s之後獲取元素,獲取的是單個元素def find_element(self, locator):WebDriverWait(self.driver, 10).until(lambda

C語言:求10 整數中最大值

求10 個整數中最大值思路:求10 個整數中最大值,可以利用陣列來完成對10個數的儲存,再用迴圈語句和條件語句來判斷數的大小, 把最大值賦值給最大值變數max,然後輸出最大值。 程式碼如下: #include<stdio.h> int main() { int i,max;

C#獲取程式執行路徑的幾種方法

通過控制檯程式打印出每種方法的結果 static void Main(string[] args) { Console.WriteLine("typeof(Program).Assembly.Location:\r\n{0}",

10簡單步驟,完全理解SQL

轉載自:http://blog.jobbole.com/55086/ 1 sql是一種宣告式語言  sql語言是為計算機聲明瞭一個你想從原始資料中獲得什麼樣的結果的一個範例,而不是告訴計算機如何能夠得到結果。  2sql的語法並不是按照語法順序執行  select

IT路要如何走?——老程式設計師的10忠告(新手的程式設計師一定要知道)

        [1]好好規劃自己的路,不要跟著感覺走!根據個人的理想決策安排,絕大部分人並不指望成為什麼院士或教授,而是希望活得滋潤一些,爽一些。那麼,就需要慎重安排自己的軌跡。從哪個行業入手,逐漸對該行業深入瞭解,不要頻繁跳槽