系統性能優化總結與思考-第一部分

1.C++代碼優化策略總結

  • 編譯器方面:用好的編譯器并用好編譯器(支持C++11的編譯器,IntelC++(速度最快)
  • GNU的C++編譯器GCC/G++(非常符合標準),Visual C++(性能折中),clang(最年輕Mac OS x)。
  • 算法方面:使用更好的算法。?
  • 數據結構優化:使用更好的數據結構(不同的數據結構在使用內存管理器的方式也有所不同)。
  • 使用更好的庫(熟悉和掌握標準C++模板庫對于進行性能優化的開發員是必須的技能,Boost Project 和 Google Code 公開了很多有用的庫)。
  • 內存優化:減少內存分配和復制(減少對內存管理器的調用是一種非常有效的優化手段)。
  • 優化內存管理(內存管理器的調度,豐富的API)。
  • 移除計算(對于單條的C++語句進行優化)。
  • 多線程使用:提高并發性(多個處理核心執行指令)。
  • 優化鎖的使用:減少鎖的使用,減少鎖的范圍,使用細粒度的鎖,采用無鎖隊列,原子鎖或線程局部存儲,鎖數據而不是代碼。

2.影響計算機優化的行為

  • 計算機的物理組成本身對計算機性能的限制。
  • 計算機的主內存是比較慢的(通往主內存的接口是限制執行速度的瓶頸(馮*諾伊曼瓶頸),(摩爾定理)每年處理器的核心的數量都會增加,但是計算機的性能未必會提高,因為這些核心只是等待訪問內存的機會(內存墻memory wall))。?
  • 計算機內存的訪問方式(并非以字節為單位),某些內存訪問會比其他的更慢(分為一級高速緩存(cache memory)、二級高速緩存、三級高速緩存、主內存、磁盤上的虛擬內存頁)。
  • 內存的容量是有限的,每個程序都會與其他程序競爭計算機資源,計算比做決定快。?
  • 在處理器中,訪問內存的性能開銷遠比其他操作的性能開銷大,非對齊訪問所需要的時間是所有字節都在同一字節中的兩倍。?
  • 訪問頻繁使用的內存地址的速度比訪問非頻繁使用的地址快,訪問相鄰地址的內存的速度比訪問相互遠隔的地址的內存塊。?
  • 訪問線程間共享的數據比訪問非共享的數據資源慢很多。當并發線程共享數據時,同步代碼降低了并發量。?
  • 有些語句隱藏了大量的計算,從語句的外表上看不出語句的性能開銷會有多大。

3.性能測量

  • 90/10規則:一個程序會花費90%的運行時去執行10%的代碼。
  • 只有正確且精確的測量才是準確的測量。?
  • 在Windows上,clock()函數提供了可靠的毫秒級的時鐘計時功能。在Windows8和之后的版本中,GetSystemTimePreciseAsfileTime()提供了亞微秒的計時功能。
  • 計算一條C++語句對內存的讀寫次數,可以估算出一句C++ 語句的性能開銷。

4.優化方法

(1)優化熱點語句

  • 緩存循環結束條件值

  • 從循環中移除不變性代碼

  • 從循環中移除無謂的函數調用

  • 從循環中移除隱含的函數調用

(2)減少函數調用開銷

函數調用開銷分析

盡管執行函數體的開銷可能會非常大,但是調用函數的開銷與調用大多數 C++ 語句的開銷 一樣,是非常小的。不過,當函數被多次調用時,累積的開銷可能會變得巨大,因此減少 這種開銷非常重要

函數調用流程

(1) 執行代碼將一個棧幀推入到調用棧中來保存函數的參數和局部變量。

(2) 計算每個參數表達式并復制到棧幀中。

(3) 執行地址被復制到棧幀中并生成返回地址。

(4) 執行代碼將執行地址更新為函數體的第一條語句(而不是函數調用后的下一條語句)。

(5) 執行函數體中的指令。

(6) 返回地址被從棧幀中復制到指令地址中,將控制權交給函數調用后的語句。

(7) 棧幀被從棧中彈出。

函數調用的基本開銷

虛函數調用開銷

(3)簡短地聲明內聯函數

(4)在使用之前定義函數:當編譯器編譯對某個函數的調用時發現該函數已經被定義了,那么編譯器能夠自主選擇內聯這次函數調用

(5)移除未使用的多態性

(6)放棄不使用的接口

(7)用switch替代if-else if-else

(8)避免使用PIMPL慣用法,編譯時間少,運行增加

(8)其他常用優化方法

4.多線程優化-未完待續

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79210.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RCL諧振電壓增益曲線

諧振電路如何通過調頻實現穩壓&#xff1f; 為什么要做諧振&#xff1f; 在諧振狀態實現ZVS導通&#xff0c;小電流關斷 電壓增益GVo/Vin&#xff0c;相當于產出投入比 當ff0時&#xff0c;G1時&#xff0c;輸出電壓輸入電壓 當G<1時&#xff0c;輸出電壓<輸入電壓 …

Linux進程相關選擇題及解析

1. 關于Linux進程創建,以下說法正確的是? A. fork()函數調用后,子進程從父進程的fork()之后開始執行 B. fork()函數返回兩次,父進程返回子進程PID,子進程返回0[10][11] C. exec函數族會替換當前進程的代碼段,但保留數據段和堆棧 D. wait()函數只能等待直接子進程退出 答…

STM32 HAL DHT11驅動程序

DHT11驅動程序會占用TIM3定時器&#xff0c;進行高精度延時。程序共包含4個文件 DHT11.c DHT11.h delay.c delay.h DHT11.c #include "stm32f1xx_hal.h" #include "dht11.h" #include "delay.h" // 添加延時頭文件 #define DHT_PORT GPIOB…

網頁防篡改與盜鏈防護:實時監控與自動化修復實踐

摘要&#xff1a;針對網頁內容篡改與盜鏈問題&#xff0c;本文基于群聯AI云防護系統&#xff0c;詳解如何通過哈希校驗、實時監控與CDN聯動實現秒級修復&#xff0c;并提供Python與AWS S3集成代碼。 一、網頁安全的核心需求 防篡改&#xff1a;保障頁面內容完整性&#xff0c;…

【4】k8s集群管理系列--harbor鏡像倉庫本地化搭建

一、harbor基本概念 ?Harbor是一個由VMware開源的企業級Docker鏡像倉庫解決方案?&#xff0c;旨在解決企業在容器化應用部署中的痛點&#xff0c;提供鏡像存儲、管理、安全和分發的全生命周期管理?。Harbor擴展了Docker Registry&#xff0c;增加了企業級功能&#xff0c;如…

Docker 安裝 Elasticsearch 8.x

Docker 安裝 Elasticsearch 8.x 前言一、準備工作二、設置容器的目錄結構三、啟動一個臨時的容器來復制配置文件四、復制配置文件到本地目錄五、刪除臨時容器六、創建并運行容器&#xff0c;掛載本地目錄七、修改文件配置監聽端口八、端口配置&#xff1a;Host 網絡模式 vs Por…

C#: 用Libreoffice實現Word文件轉PDF

現實場景中要實現Word格式轉PDF格式還是比較常見的。 如果要用開源的組件&#xff0c;只有用Libreoffice了。 一、下載安裝Libreoffice 先進入如下鏈接&#xff0c;找到最新版本和匹配的操作系統來安裝。 官網試過&#xff0c;下載是能下載&#xff0c;但安裝了用不了&…

MoogDB數據庫日常維護技巧與常見問題解析

在當今的數據驅動世界中&#xff0c;數據庫作為信息存儲與管理的核心組件&#xff0c;扮演著舉足輕重的角色。MoogDB作為一款高性能、易擴展的數據庫解決方案&#xff0c;越來越受到開發者和企業的青睞。為了確保MoogDB的穩定性與高性能&#xff0c;定期的日常維護及對常見問題…

JAVA多線程的幾種實現方式

?1. 繼承 Thread 類? ?原理?&#xff1a;通過繼承 Thread 類并重寫 run() 方法定義線程任務&#xff0c;調用 start() 啟動線程?。?代碼示例?&#xff1a; public class MyThread extends Thread {Overridepublic void run() {System.out.println("線程 " g…

爬蟲(基本知識介紹,urllib庫的說明)

爬蟲 爬蟲基礎&#xff08;一些基本原理的梳理&#xff09; scheme://[username:password]hostname[:port][/path][;parameters][?query][#fragment] 注&#xff1a; parameters 和 query 混用&#xff0c;并且現在 query 用的多 ?query 查詢 &#xff0c;用來查詢某類資源…

探秘串口服務器廠家:背后的故事與應用

在科技飛速發展的今天&#xff0c;串口服務器作為連接串口設備與網絡的橋梁&#xff0c;在工業自動化、智能交通、智能家居等眾多領域發揮著關鍵作用。你是否好奇&#xff0c;那些生產串口服務器的廠家究竟有著怎樣的故事&#xff1f;它們的產品背后又蘊含著怎樣的原理呢&#…

工廠能耗系統智能化解決方案 —— 安科瑞企業能源管控平臺

安科瑞顧強 政策背景與“雙碳”戰略驅動 2025年《政府工作報告》明確提出“單位國內生產總值能耗降低3%左右”的目標&#xff0c;要求通過產業結構升級&#xff08;如高耗能行業技術革新或轉型&#xff09;、能源結構優化&#xff08;提高非化石能源占比&#xff09;及數字化…

BI面向模型開發和面向報表開發,有什么區別?

在數字化時代&#xff0c;商業智能&#xff08;BI&#xff09;已成為企業決策不可或缺的工具。BI項目實施時&#xff0c;通常有兩種開發模式&#xff1a;面向模型開發和面向報表開發。雖然兩者都旨在通過數據驅動決策&#xff0c;但在開發邏輯、目標價值和技術路徑上存在顯著差…

OpenHarmony人才認證證書

OpenHarmony人才認證體系目前支持初級工程師認證&#xff0c;要求了解OpenHarmony開源項目、生態進展及系統移植等基礎知識&#xff0c;熟練掌握OpenHarmony的ArkUI、分布式軟總線、分布式硬件、分布式數據管理等基礎能力使用&#xff0c;具備基礎的開發能力。 考試流程可參考O…

映射網絡路路徑和ftp路徑原理是什么,如何使用,有什么區別

文章目錄 一、原理1. 映射網絡路徑2. FTP路徑 二、使用方法1. 映射網絡路徑2. FTP路徑 三、主要區別1. 協議與功能2. 安全性與權限3. 適用場景 四、如何選擇&#xff1f;五、注意事項 映射網絡路徑&#xff08;如SMB/CIFS或NFS&#xff09;和FTP路徑&#xff08;FTP/FTPS/SFTP&…

Windows 圖形顯示驅動開發-WDDM 1.2功能—Windows 8 中的 DirectX 功能改進(一)

Windows 8包括 Microsoft DirectX 功能改進&#xff0c;使開發人員、最終用戶和系統制造商受益。 功能改進在以下幾個方面&#xff1a; 像素格式 (5551、565、4444) &#xff1a;在低功耗硬件配置下&#xff0c;DirectX 應用程序的性能更高。雙精度著色器功能&#xff1a;高級…

GitHub 趨勢日報 (2025年04月15日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1yeongpin/cursor-free-vip[Support 0.48.x]&#xff08;Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher…

2025年推薦使用的開源大語言模型top20:核心特性、選擇指標和開源優勢

李升偉 編譯 隨著人工智能技術的持續發展&#xff0c;開源大型語言模型&#xff08;LLMs&#xff09;正變得愈發強大&#xff0c;使最先進的AI能力得以普及。到2025年&#xff0c;開源生態系統中涌現出多個關鍵模型&#xff0c;它們在各類應用場景中展現出獨特優勢。 大型語言…

回收鍍錫廢水的必要性(筆記)

鍍錫廢水若直接排放&#xff0c;將對環境、經濟和社會造成多重危害&#xff0c;其回收處理具有迫切性和深遠意義。以下從環境、資源、法規、技術與實踐、可持續發展五大維度展開分析&#xff1a; 一、環境危害的緊迫性&#xff1a;重金屬與污染物的致命威脅 成分復雜&#xf…

14.2 - VDMA彩條顯示實驗之動態時鐘

文章目錄 1 實驗任務2 系統框圖3 硬件設計4 軟件設計4.1 dynclk_api.h文件4.2 math_compat.h文件4.3 dynclk_api.c文件4.4 main.c文件 1 實驗任務 參見14.1。 2 系統框圖 參見14.1。 3 硬件設計 注意事項&#xff1a;基于14.1做如下改動 使能Clocking Wizard IP核的Dynam…