1. 程式人生 > >c++ 程式效能優化(一)

c++ 程式效能優化(一)

最近在看《c++ 效能優化指南》書籍,從書中學習到了不少c++ 程式優化的點,平時程式碼中一定要注意這些坑,在此記錄下來。本篇幅主要是講下字串處理效能的優化。

一.下面來看一個簡單的例子,我們平時 寫程式碼 不注意的時候,最有可能寫出的是如下所示的第一種 remove_ctrl() 形式的程式碼。

  #include <stdlib.h> 
  #include <stdio.h> 
  #include <time.h>
  #include <iostream> 
  #include <sys/time.h>

  using namespace std;

  string remove_ctrl(string s)  //沒有優化的程式碼
  {
    string result;
    for(int i =0;i < s.length(); ++ i)
    {
      if(s[i] >= 0x20)
      {
        result = result + s[i];
      }

    }
    return  result;

  } 

  string remove_ctrl2(string s)   //使用複合賦值 避免臨時字串
  {
    string result;
    for(int i =0;i < s.length(); ++ i)
    {
      if(s[i] >= 0x20)
      {
        result += s[i];
      }

    }
    return  result;

  } 

  string remove_ctrl3(string s)  //預留儲存空間,減少記憶體的重新分配
  {

    string result;
    result.reserve(s.length());
    for(int i =0;i < s.length(); ++ i)
    {
      if(s[i] >= 0x20)
      {
        result += s[i];
      }

    }
    return  result;

  }

  string remove_ctrl4(const string& s)  //
  {

    string result;
    result.reserve(s.length());
    for(int i =0;i < s.length(); ++ i)
    {
      if(s[i] >= 0x20)
      {
        result += s[i];
      }

    }
    return  result;

  }
  void test()
  {
    
    uint64_t time1 = 0;
    uint64_t time2 = 0;
    uint64_t time3 = 0;
    uint64_t time4 = 0;

    string str = "
[email protected]
"; struct timeval start, end; gettimeofday(&start,NULL); for(int i=0;i < 10000;++i) { remove_ctrl(str); } gettimeofday(&end,NULL); time1 = ( end.tv_sec - start.tv_sec ) * 1000 * 1000 + end.tv_usec - start.tv_usec; gettimeofday(&start,NULL); for(int i=0;i < 10000;++i) { remove_ctrl2(str); } gettimeofday(&end,NULL); time2 = ( end.tv_sec - start.tv_sec ) * 1000 * 1000 + end.tv_usec - start.tv_usec; gettimeofday(&start,NULL); for(int i=0;i < 10000;++i) { remove_ctrl3(str); } gettimeofday(&end,NULL); time3 = ( end.tv_sec - start.tv_sec ) * 1000 * 1000 + end.tv_usec - start.tv_usec; gettimeofday(&start,NULL); for(int i=0;i < 10000;++i) { remove_ctrl4(str); } gettimeofday(&end,NULL); time4 = ( end.tv_sec - start.tv_sec ) * 1000 * 1000 + end.tv_usec - start.tv_usec; cout << " time1 is :" << time1 << " us" << endl; cout << " time2 is :" << time2 << " us" << endl; cout << " time3 is :" << time3 << " us" << endl; cout << " time4 is :" << time4 << " us" << endl; } int main() { test(); return 0; }

程式執行的結果如下:

從上面的結果可以看到,第一種方式字串處理 效率最低。

(1).remove_ctrl函式中result + s[i] 運算開銷很大,它會呼叫記憶體管理器去構建一個臨時字串物件來儲存連線後的字串,若字串str的長度是n,則需要呼叫n次記憶體管理器建立臨時字串物件,需要呼叫n 次記憶體管理器來釋放記憶體。

(2).remove_ctrl2 函式優化的主要是 利用複合賦值 避免臨時字串的建立,從上圖中可以看出,相比較第一種方法效能提升很多。

(3).remove_ctrl3 中,result 字串分配的記憶體空間 是一個動態增長過程,result 字串會被反覆的複製到一個更大的內部緩衝區。 每次result字串緩衝區發生溢位時,按照std::string 字串處理方式 會申請兩倍的記憶體空間。那麼在整個處理過程中,會根據輸入字串長度大小,多次申請 分配新的記憶體空間。通過reserve() 函式 預先分配好足夠的記憶體大小空間 來進行優化。

(4).remove_ctrl4 中主要是通過常量引用 傳入引數,省去了引數在函式中的一次 昂貴的記憶體分配。上面3種函式的引數 將會通過複製建構函式來進行初始化,需要一次記憶體的分配。

相關推薦

c++ 程式效能優化()

最近在看《c++ 效能優化指南》書籍,從書中學習到了不少c++ 程式優化的點,平時程式碼中一定要注意這些坑,在此記錄下來。本篇幅主要是講下字串處理效能的優化。 一.下面來看一個簡單的例子,我們平時 寫程式碼 不注意的時候,最有可能寫出的是如下所示的第一種 remove_ct

C#程式效能優化

程式中我們每一絲動作都會加大程式執行的負擔,當剛開始學習程式的時候常常不會去考慮程式執行的效率,大多數情況是為了實現功能,只要功能達到我想要的那麼就算是達成了此專案標。當大部分功能的編碼實現對我們來說都不是大的問題的時候,我們要提升就要考慮怎樣把程式寫的更加規範更加高效。怎

記憶體池的設計和實現 -- C++應用程式效能優化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++ 行內函數 摘自 C++ 應用程式效能優化

行內函數 在C++語言的設計中,行內函數的引入可以說完全是為了效能的考慮。因此在編寫對效能要求比較高的C++程式時,非常有必要仔細考量行內函數的使用。 所謂"內聯",即將被呼叫函式的函式體程式碼直接地整個插入到該函式被呼叫處,而不是通過call語句進行。當然,編譯器在真正進行"內聯"時,因為考慮到被行內函數

記憶體池的設計和實現 -- 《C++應用程式效能優化

本書主要針對的是 C++ 程式的效能優化,深入介紹 C++ 程式效能優化的方法和例項。全書由 4 個篇組成,第 1 篇介紹 C++ 語言的物件模型,該篇是優化 C++ 程式的基礎;第 2 篇主要針對如何優化 C++ 程式的記憶體使用;第 3 篇介紹如何優化程式的啟動效能;第 4 篇介紹了三類效能優化工具,即

Java效能優化:設計優化程式優化,開發必備優化技巧!

現代大規模關鍵性系統中的Java效能調優,是一項富有挑戰的任務。你需要關注各種問題,包括演算法結構、記憶體分配模式以及磁碟和檔案I/O的使用方式。效能調優最困難的通常是找到問題所在,即便是經驗豐富的人也會被他們的直覺所誤導。效能殺手總是隱藏在最意想不到的地方。 Java效能問題一直困擾著廣大程式

python程式效能優化

最近工作中有個任務,就是優化一個模型的實時性。從有到無,主要完成了以下內容。 0.模型的邏輯 1.演算法邏輯 2.程式碼重構 3.程式的效能優化,包括編譯、多執行緒、多程序、numba 4.語言 numba包,經測試,比較適用於陣列、矩陣等數值計算,其他的型別操作,容易報錯。

微信小程式效能優化方案——讓你的小程式如此絲滑

微信小程式如果想要優化效能,有關鍵性的兩點: 提高載入效能 提高渲染效能 接下來分別來介紹一下: 提高載入效能 首先,問一個問題,當用戶點選小程式後發生了什麼? 上圖中的三個狀態,我們經常遇到,它們分別對應小程式的下面三個狀態: 有三個點的白屏(左側): 下載程式碼

C程式碼效能優化總結

轉自:https://blog.csdn.net/chenyq991/article/details/79047741 1、優化程式碼框架 個人覺得程式碼架構對效能的影響至關重要,就好骨架之於人,所以我把這個放在第一點。舉個簡單的例子: 優化前: void main() { whi

C# http 效能優化500毫秒到 60 毫秒

偶然發現 C# 的 HttpRequest 要比 Chrome 請求同一Url 慢好多。C# HttpRequest 要500毫秒 而Chrome 只需要 39ms。 作為有責任感的 碼農。這個 必須優化。。 後來 整理 各種方法做了優化  HttpWebRequest request

微信小程式效能優化技巧

摘要: 如果小程式不夠快,還要它幹嘛? 原文:微信小程式效能優化方案——讓你的小程式如此絲滑 作者:杜俊成要好好學習 Fundebug經授權轉載,版權歸原作者所有。 微信小程式如果想要優化效能,有關鍵性的兩點: 提高載入效能 提高渲染效能 接下來分別來介紹一下: 提高載

Java程式效能優化—十年碼農總結的程式設計小技巧

程式的效能受程式碼質量的直接影響。在本文中,主要介紹一些程式碼編寫的小技巧和慣例,這些技巧有助於在程式碼級別上提升系統性能。 1、慎用異常 在Java軟體開發中,經常使用 try-catch 進行錯誤捕獲,但是,try-catch 語句對系統性能而言是非常糟糕的。雖然在一次 try-catc

【Java程式效能優化 第一版】第四章

                                 第4章  並行程式開發與優化    本章主要介紹基於Java的並行程式開發及其優化方法。對於多核CPU,傳統的序列程式已經無法很好發揮CPU的效能。此時,就需要通過使用多執行緒並行的方式挖掘CPU的潛能。本章

最新Java程式效能優化,讓你的Java程式更快、更穩定

Eureka  Eureka(原來以為是縮寫,原來就是一個單詞,翻譯為:我發現了,我找到了!0.0)是Netflix開源的一款提供服務註冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的

Java程式效能優化 讀書筆記(六)設計模式:觀察者模式

一、觀察者模式 觀察者模式定義了物件間的一種一對多依賴關係,使得每當一個物件改變狀態,則所有依賴於它的物件都會得到通知並被自動更新。它將觀察者和被觀察者的物件分離開。提高了應用程式的可維護性和重用性。觀察者模式又稱為釋出/訂閱(Publish/Subscribe)模式。 觀

資料庫效能優化:SQL索引一步到位

SQL索引在資料庫優化中佔有一個非常大的比例, 一個好的索引的設計,可以讓你的效率提高几十甚至幾百倍,在這裡將帶你一步步揭開他的神祕面紗。   1.1 什麼是索引?   SQL索引有兩種,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系統的效能,加快資

ORACEL SQL 效能優化()

當你向ORACLE 提交一個SQL語句,ORACLE會首先在這塊記憶體中查詢相同的語句. 這裡需要註明的是,ORACLE對兩者採取的是一種嚴格匹配,要達成共享,SQL語句必須完全相同(包括空格,換行等). 共享的語句必須滿足三個條件:

ios 效能優化()

邏輯優化 程式碼封裝優化 程式碼執行效率優化 介面優化 離屏渲染優化 介面載入優化 邏輯優化 程式碼封裝優化 程式碼的封裝

c# 程式只能執行

防止程式執行多個例項的方法有多種,如:通過使用互斥量和程序名等.而我想要實現的是:在程式執行多個例項時啟用的是第一個例項,使其獲得焦點,並在前端顯示. 主要用到兩個API 函式: ShowWindowAsync 該函式設定由不同執行緒產生的視窗的顯示狀態。 SetForeg

Andorid效能優化() 之 如何給應用進行記憶體優化

1 前言 Android系統為每個應用程序都分配一個有封頂的堆記憶體值,當應用記憶體佔用過高到沒有足夠的記憶體來提供給新物件分配並且垃圾回收機制也已經沒有空間可回收時就會OOM。當一個應用記憶體佔用過高會使一些效能差的手機系統記憶體緊缺,使得整體系統卡頓。而且應用記憶體佔用過高後,一旦退到後