精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何提高C++性能的編程技術

汽車電子技術 ? 來源:程序喵大人 ? 作者: 程序喵大人 ? 2023-02-21 13:56 ? 次閱讀

家好,我是程序喵。

最近看了一本書《提高C++性能的編程技術》,這本書內容比較老,有些內容不太適合現在的編譯器,但里面很多內容還是值得我們學習的。

我這里整理出了自認為有用的條目分享給大家,希望對大家有所幫助,想了解具體內容的的朋友可以直接去看書哈。

我將這些內容分為了三大類別:

  • 對象的創建與銷毀:主要介紹對象構造與銷毀的代價和臨時對象那些事。
  • 函數調用:主要介紹內聯和虛函數及模板相關的知識點。
  • 設計:如何設計并編寫出更高效的代碼。

下面是正文,越下面的內容越有用:

  • 對象的創建與銷毀:
    • C++中對象的定義會隱式的執行構造函數和析構函數,這是有開銷的,對象的生命周期不是無償的,至少對象的創建和銷毀會消耗CPU周期。所以若非必要,不要隨便定義對象,要等到需要使用對象的地方再創建它。
    • 對象的創建或銷毀會觸發對父對象和成員對象的遞歸創建或銷毀,要當心復雜層次中對象的復合使用。它們使得創建和銷毀的開銷更加高昂。
    • 對象的拷貝是有開銷的,很多時候可以減少拷貝,考慮按引用或者指針傳遞和返回對象。
    • RVO可以省去創建和銷毀局部對象的步驟,從而改善性能。
    • 臨時對象會以構造函數和析構函數的形式降低一半的性能。在可能是“+、-、*”或者“/”的地方,可以考慮使用=運算符消除臨時對象。
    • 編譯器必須初始化被包含的成員對象之后再執行構造函數體。必須在初始化階段完成成員對象的創建。這可以降低隨后在構造函數部分調用賦值操作符的開銷。在某些情況下,這樣也可以避免臨時對象的產生。
    • 將構造函數聲明為explicit,可以避免隱式轉換,一般這塊都會被列為項目的編碼規范,不符合這個規范是過不了code review的。
  • 函數調用:
    • 絕大多數的性能優化是靠內聯做到的。
    • 內聯就是用方法的代碼來替換對方法的調用。(和宏是不是挺像)
    • 內聯通過消除調用開銷來提升性能,并且允許進行調用間優化。
    • 內聯也有缺點,尤其是濫用的情況下。內聯可能會使代碼量變大,而代碼量增多后會較原先出現更多的緩存失敗和頁面錯誤。
    • 為什么說虛函數慢?虛函數的代價在于無法內聯函數調用,因為這些調用是在運行時動態綁定的。唯一潛在的效率問題是從內聯獲得的速度(如果可以內聯的話)。
    • 模板比繼承提供更好的性能。它把對類型的解析提前到編譯期間,也可以認為這是沒有成本的。
  • 設計:
    • 軟件性能和靈活性之間存在一種基本的平衡,太靈活的設計一般性能都不太好,你的設計只需在當前范圍之內足夠靈活就可以了。在完成同樣的簡單工作時,char*有時可以比string對象更有效率。
    • 引用計數想必大家都知道,有些場景中沒必要使用引用計數,使用的簡單的非計數對象即可,但是有些情況下,引用計數是個非常有用且有效的設計,尤其是在下述場景中:
      • 目標對象是很大的資源消費者。
      • 資源分配和釋放的代價很高。
      • 高度共享,好多對象共享同一資源
    • 最快的代碼是從不執行的代碼,可做以下思考:
      • 你打算使用該計算結果嗎?不打算使用就別浪費資源啦
      • 你現在需要該結果嗎?請在真正需要的時候再進行計算。在一些執行流程中有些結果永遠不會被使用,因此不必過早地計算
      • 你是否已經知道結果?那可以考慮結果重復使用,而不是每次都做計算
    • 有的時候可能無法繞開該計算,此時就必須完成它,那如何加快計算速度?可做
      以下思考:
      • 該計算是否過于通用?上面說過,沒必要過度設計,滿足需求即可。
      • 有些情況下有些考慮使用庫調用,有些庫調用比較靈活,有些庫調用性能比較高,考慮使用高效的算法和數據結構。
      • 盡量減少內存管理,這些調用的代價比較高。
      • 80-20原則,如果考慮所有可能的輸入數據,則可以發現20%的數據在80%時間里出現。因此,應當以犧牲其他不經常出現的場景為代價來提高典型輸入的處理速度。
      • 緩存、RAM和磁盤訪問的速度差異很明顯,可能有10倍以上的差異。應該多編寫緩存友好的代碼。
    • 有些計算只有在特定的if-else分支下才需要,所以沒必要過早計算,因為有可能它的計算結果不會被用到。
    • 定期清理不需要的代碼:大型軟件往往會變得錯綜復雜,雜亂不堪。混亂軟件的一大特點就是執行失效代碼(那些曾經用來實現某個目標,但現在已經不需要的代碼)。定期清理失效和僵死代碼可以增強軟件性能,同時對于軟件也是一種維護。
    • 考慮利用多處理器
      • 將任務做分解:將大的任務分為小任務,使線程并發地執行這些小任務。
      • 縮小臨界區:臨界區應該只包含關鍵代碼,不直接操作共享資源的代碼不要放在臨界區內。
      • 減小鎖粒度:不要用同樣的鎖來保護所有資源,除非這些資源是同時更新的。
      • 讀寫鎖:讀多寫少可以考慮使用讀寫鎖。
      • 偽共享:不要在類定義里把兩個使用頻度都很高的鎖放太靠近,它們共享同一個緩存行可能觸發緩存一致性風暴。
      • 驚群現象:仔細分析您的鎖調用的特征。當鎖被釋放時,是所有的等待線程都被喚醒還是只喚醒一個線程?喚醒所有線程會威脅到應用的可擴展性。
    • 要使用的存儲器離處理器越遠,訪問所需的時間就越長。離處理器最近的是寄存器,雖然容量很少,但是速度很快。對寄存器的優化對程序的性能提升而言是極為有益的。
    • 上下文切換的開銷巨大,請盡量避免上下文切換。

打完收工。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10824

    瀏覽量

    211138
  • 函數
    +關注

    關注

    3

    文章

    4304

    瀏覽量

    62427
  • C++
    C++
    +關注

    關注

    22

    文章

    2104

    瀏覽量

    73489
收藏 人收藏

    評論

    相關推薦

    Borland_C++_Builder高級編程技術

    Borland_C++_Builder高級編程技術
    發表于 08-17 14:32

    vga使用編程技術

    vga使用編程技術
    發表于 03-21 19:04

    急聘C++ /OPENGL/ matlab/安卓兼職技術

    因業務上漲,現大量急聘C++ /OPENGL/ matlab/安卓編程技術。想做兼職者Q我:740718010,在校研究生亦可!
    發表于 03-11 14:39

    經典UML狀態圖實用C++設計嵌入式系統事件驅動型編程技術資料分享

    UML狀態圖的實用C/C++設計嵌入式系統的事件驅動編程技術第二版內含國外版本和國內翻譯版本
    發表于 04-24 14:34

    SQL編程技術的特點有哪些

    SQL編程技術可以有效的克服SQL語言實現復雜應用方面的不足,提高應用系統和數據管理系統間的互操作性。SQL的特點之一是在交互式和嵌入式二種不同的使用方式下, SQL的語法結構基本上是一致的。嵌入式
    發表于 12-22 07:04

    c++程序設計語言(特別版)

    c++程序設計語言介紹了標準C++以及由C++所支持的關鍵性編程技術和設計技術。標準C++較以前
    發表于 09-05 15:28 ?0次下載

    C++面向對象多線程編程 (pdf電子版)

    C++面向對象多線程編程共分13章,全面講解構建多線程架構與增量多線程編程技術。第1章介紹了
    發表于 09-25 09:39 ?0次下載

    Visual C++ 6.0 高級編程 -下載

    Visual C++ 6.0 高級編程,免費下載:全面介紹了Visual C++ 6.0的中高級編程技術,其內容主要有:內存管理、高級圖形處理、使用Internet、創建多線程程序、創
    發表于 07-12 15:25 ?0次下載
    Visual <b class='flag-5'>C++</b> 6.0 高級<b class='flag-5'>編程</b> -下載

    Visual C++網絡高級編程_陳堅

    本書在對Visual C++各種編程技術和TCP/IP進行系統介紹的基礎上,重點講解網絡編程的高級應用、使用技巧和難點。包括基本網絡編程技術,Telnet協議的實現,HTTP協議的實現
    發表于 08-26 15:19 ?0次下載
    Visual <b class='flag-5'>C++</b>網絡高級<b class='flag-5'>編程</b>_陳堅

    Visual C++編程技術文檔

    Visual C++編程技術文檔!資料來源網絡,如有侵權,敬請見諒
    發表于 11-20 15:00 ?0次下載

    Visual C# 2005編程技術文檔

    Visual C# 2005編程技術文檔!資料來源網絡,如有侵權,敬請見諒
    發表于 11-20 14:50 ?0次下載

    Halcon9.0編程技術詳解

    Halcon9.0編程技術詳解Halcon9.0編程技術詳解
    發表于 12-22 15:20 ?0次下載

    實用編程技術c++編程思想》電子教材免費下載

    以進行基于過程的程序設計,因而C++就適應的問題規模而論,大小由之。C++不僅擁有計算機高效運行的實用性特征,同時還致力于提高大規模程序的編程質量與程序設計語言的問題描述能力。
    發表于 08-27 08:00 ?0次下載

    單片機原理與應用及C51編程技術

    單片機原理與應用及C51編程技術課件下載
    發表于 08-29 10:21 ?11次下載

    C語言的基本概念和編程技術

    電子發燒友網站提供《C語言的基本概念和編程技術.pdf》資料免費下載
    發表于 11-20 10:18 ?0次下載
    <b class='flag-5'>C</b>語言的基本概念和<b class='flag-5'>編程技術</b>