第2章 性能測量

理解應用程序性能的第一步是學會對它進行測量。

與絕大多數功能問題相比,性能問題通常很難跟蹤和復現。

任何關注過性能評估的人可能都知道公允地進行性能測量并從中得到準確結論是多么困難。

因為在測量中存在誤差,性能分析通常需要統計方法進行處理。

開展公允地性能實驗是獲得精確及有意義結果的基本步驟。設計性能測試和配置測試環境都是性能評估工作的重要組成部分。

2.1 現代系統中的噪聲

動態頻率調節是一個硬件特性,但是測量結果差異還有可能來自軟件功能。

不幸的是,測量偏差還不只來自環境配置。Unix環境變量的大小(即存儲環境變量所需要的字節數)和鏈接順序(提供給鏈接器的目標文件順序)能夠對性能產生不可預知的影響。

在運行時有效且重復地將代碼、堆棧和堆對象隨機放置,可以消除由內存排布引起的測量偏差。

獲得一致的測量結果需要所有基準測試都在同樣的條件下進行。

消除系統的不確定性有助于進行定義明確、穩定的性能測試,需要控制基準測試中大部分變量,包括輸入、環境配置等。

當估計實際程序的性能優化效果時,不建議去除系統的不確定的行為。工程師應當嘗試復制被優化的目標系統的配置,在被測系統中引入人為調整會導致用戶在實際使用中的結果不一致。此外,任何性能分析工作-包括采樣,都應當在與實際部署最接近的系統下進行。

2.2 生產環境中的性能測量

隨著虛擬化和容器等技術的日漸流行,公有云供應商也嘗試最大化服務器資源的利用率。但是這種環境為性能測量帶來了新的困難,因為與相鄰進程共享資源會對性能測量產生不可預知的影響。

大型服務提供商通過部署遙測系統來監控用戶設備的性能已經成為一種趨勢。

測量開銷是生產環境監控的一個重要問題。由于任何監控都會影響正在運行的服務的性能,因此應該使用盡可能輕量的性能剖析方法。

通常可以接受整體不超過1%的性能損失的檢測開銷,減少監控開銷的辦法包括限制被監控的機器數量和使用更小的監控時間間隔。

2.3 自動檢測性能退化問題

軟件供應商提高產品的部署頻率逐漸成為一種趨勢,但是軟件的性能缺陷會以驚人的速度蔓延到生產環境中。

軟件性能退化是指軟件從一個版本演進到下一個版本時被錯誤地引入缺陷。解決辦法如下:
? ? ? ? 1. 安排人員看圖來比較結果,不過這種辦法很快就被拋棄了,因為人很容易因為注意力不集中而錯過性能退化缺陷。
? ? ? ? 2. 設定1個簡單的閾值閥門。缺點在于選擇合適的閾值門限是非常困難的事情,并且不能保證誤報率低。閾值設定過低會導致誤報一些由隨機噪聲引起的而不是代碼變化引起的性能退化數據,閾值設定過高會導致過濾不出真正存在的性能退化問題。

無論使用何種算法來檢測性能退化問題,典型的CI系統都應當能夠自動進行以下動作:
? ? ? ? 1. 配置待測試系統。
? ? ? ? 2. 運行程序;
? ? ? ? 3. 報告運行結果;
? ? ? ? 4. 判斷性能是否發生變化;
? ? ? ? 5. 將結果可視化。

CI系統應當能夠同時支持自動基準測試和手動基準測試,產生可復現的結果,并對發現的性能退化問題生成工單。迅速檢測性能退化問題也非常重要。

2.4 手動性能測試

本地性能評估的基本建議:
? ? ? ? 1. 多次測量基線性能;
? ? ? ? 2. 多次測量修改后的程序的性能;
? ? ? ? 3. 對2者進行比較;
使用統計分布圖的一個優勢是可以發現基準測試中的不良行為。如果數據分布是雙峰的,基準測試會表現出兩類不同的行為,引起雙峰分布的常見原因是代碼有快、有慢兩條執行路徑,例如訪存緩存、獲取鎖等。解決這些問題的方法是隔離不同的功能模塊并分別進行基準測試。

性能數據分布的可視化展示可以幫助我們發現某些異常,但我們不應當同它來進行加速比的計算。假設檢驗非常適合用來確定性能加速(減速)的表現是否具有隨機性。

一旦通過假設檢驗方法確定2組數據存在統計上顯著的差異,就可以使用算術平均或幾何平均的方法來計算加速比。注意對于小樣本采樣,均值和幾何均值會受到異常值影響。除非數據分布具有小方差,否則不應當只考慮使用均值。

如果測量值的方差與均值大小在同一個數量級,那么均值就不是具有代表性的指標。

為了準確地計算加速比,最重要的工作之一就是收集大量的樣本數據。這聽上去很容易,但有時并不可行,太多基準測試疊加下來的測試時間太長了。

需要收集多少樣本數據才滿足統計分布需要呢?這取決于對比測試的精確到要求。分布數據中樣本的方差越小,需要的樣本數越少。實施自適應策略,收集樣本直到標準差達到特定的范圍。

另一個需要特別小心的是異常值的存在。對某些類型的基準測試而言,異常值可能是重要的指標。

2.5 軟件計時器和硬件計時器

系統級高分辨率計時器:通過統計自某任意時間起開始流逝的滴答數而實現。系統級計時器分辨率是ns級別,并且在所有CPU上都是一致的,它適合用來測量持續時間超過1us的事件。
時間戳計時器TSC:通過硬件寄存器實現的硬件計時器,它適合用來測量持續時間從ns到1 min之間的事件,可以用編譯器的內置函數__rdtsc查詢。

如果需要測量的時間很短暫,則TSC可以提供更好的準確度。相反,如果需要測量的時間長達數小時,則TSC測量毫無意義。除非真的需要時鐘周期的精度,否則大部分情況下選擇系統計時器通常就足夠了。

2.6 微基準測試

微基準測試程序是在優化某些特定功能時跟蹤優化進展的手段。對于C++而言,使用Google benchmark庫,C#則是BenchmarkDotNet庫,Julia則是BenchmarkTools庫,Java則是Java Microbenchmark Harness。

定義一個基準測試優劣的依據是,它能否在真實條件下測試將來要使用的功能的性能。

如果基準測試使用的合成輸入與實際使用的輸入不同,那么基準測試可能會誤導你。所以,在根據單元測試的結果總結結論時要小心。

2.7 本章小結

1. 由于測試的不穩定性,調試性能通常比調試功能更為困難。
2.確定預期目標,需要為如何衡量該目標設定有意義的定義和指標。根據關心的內容,它可能是吞吐量、延遲、每秒操作數(屋頂線模型)等。
3.再生產部署中衡量性能時,為了處理環境噪聲的問題,需要使用統計方法分析結果。
4. 越來越多的大型分布式軟件供應商選擇直接在生產系統上剖析和監控性能,這要求只能使用輕量級的剖析技術。
5. 采用自動化性能跟蹤系統有助于防止性能退化問題滲透到生產軟件系統中,此類CI系統應能夠運行自動化性能測試,可視化結果并標記潛在缺陷,這也是向受眾展示性能結果的穩妥辦法。
6. 性能數據分布之間的統計關系可以通過假設檢驗方法來識別和發現。
7. 系統級高分辨率計時器適合測量持續時間超過1us的事件,若需要高精度測量短事件,則可以使用時間戳計時器。
8. 微基準測試適合迅速證明一些事情,但是你應該始終在實際條件下用真實的程序驗證你的想法。

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

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

相關文章

ThreadLocal(超詳細介紹!!)

關于ThreadLocal,可能很多同學在學習Java的并發編程部分時,都有所耳聞,但是如果要仔細問ThreadLocal是個啥,我們可能也說不清楚,所以這篇博客旨在幫助大家了解ThreadLocal到底是個啥? 1.ThreadLocal是什么&…

Android設備通過藍牙HID技術模擬鍵盤實現

目錄 一,背景介紹 二,技術方案 2.1 獲取BluetoothHidDevice實例 2.2 注冊/解除注冊HID實例 2.3 Hid report description描述符生成工具 2.4 鍵盤映射表 2.5 通過HID發送鍵盤事件 三,實例 一,背景介紹 日常生活中&#xff0…

AndroidStudio中修改打包生成的apk名稱

1.配置手機架構 splits {abi {enable truereset()include armeabi-v7a,arm64-v8auniversalApk false} } 2.多渠道 productFlavors {normal {applicationId "*****"manifestPlaceholders [appName: "string/app_name_normal"]}driver {applicationId &qu…

圖片轉換成pdf格式?這幾種轉換格式方法了解一下

圖片轉換成pdf格式?將圖片轉換成PDF格式的好處有很多。首先,PDF格式具有通用性,可以在幾乎任何設備上查看。其次,PDF格式可以更好地保護文件,防止被篡改或者復制。此外,PDF格式還可以更好地壓縮文件大小&am…

使用Kaptcha生成驗證碼

說明:驗證碼,是登錄流程中必不可少的一環,一般企業級的系統,使用都是專門制作驗證碼、審核校驗的第三方SDK(如極驗)。本文介紹,使用谷歌提供的Kaptcha技術,制作一個簡單的驗證碼。 …

sqlserver數據庫導出到mysql

愛到分才顯珍貴,很多人都不懂珍惜擁有,只到失去才看到,其實那最熟悉的才最珍貴的。 這里只介紹一種方式,有很多的方式。 1.使用Navicat 安裝 下載 2.工具 數據傳輸 3.選擇源和目標 然后開始 4.最好導入前備份一下庫

【KVM虛擬化環境部署】

環境部署 KVM虛擬化環境 1、裝系統時手動選擇安裝 2、CentOS 7 最小化安裝 yum install qemu-kvm qemu-img libvirt -y yum install virt-install libvirt-python virt-manager python-virtinst libvirt-client -y安裝好CentOS 7后,去設置里面點擊處理器&#x…

4.0 Spring Boot入門

1. Spring Boot概述 Spring Boot介紹 Spring Boot是Pivotal團隊在2014年推出的全新框架,主要用于簡化Spring項目的開發過程,可以使用最少的配置快速創建Spring項目。 Spring Boot版本 2014年4月v1.0.0.RELEASE發布。 ? 2.Spring Boot特性 約定優于配…

docker-compose部署可道云

文章目錄 一. Mac1.1 下載源碼1.2 部署1.2.1 修改密碼部署(可忽略)1.2.2 直接部署 1.3 卸載1.4 訪問 二. Win2.1 下載源碼2.2 部署2.2.1 修改密碼部署(可忽略)2.2.2 直接部署 2.3 卸載 一. Mac 1.1 下載源碼 mkdir -p /Users/wanfei/docker-compose && cd /Users/wan…

mysql 數據備份和恢復

操作系統:22.04.1-Ubuntu mysql 版本:8.033 binlog 介紹 binlog 是mysql 二進制日志 binary log的簡稱,可以簡單理解為數據的修改記錄。 需要開啟binlog,才會產生文件,mysql 8.0 默認開啟,開啟后可以在 /var/lib/mysql &#xff…

技術債 筆記

目錄 1. 技術債 筆記1.1. 什么是技術債1.2. 討論1.3. 國內技術從業者怎么看? 1. 技術債 筆記 1.1. 什么是技術債 1992 年, Ward Cunningham 在敏捷宣言中首次提出了"技術債"概念, 主要指有意或無意地做了錯誤的或不理想的技術決策所累積的債務。隨后, 《重構》一書…

sql中union all、union、intersect、minus的區別圖解,測試

相關文章 sql 的 join、left join、full join的區別圖解總結,測試,注意事項 1. 結論示意圖 對于intersect、minus,oracle支持,mysql不支持,可以變通(in或exists)實現 2.測試 2.1.創建表和數…

vue pc端項目el-upload上傳圖片時加水印

html代碼&#xff1a; <a-uploadclass"avatar-uploader"list-type"picture-card":file-list"uploadFileList":custom-request"uploadDoneHandle":before-upload"beforeUpload":remove"removeHandle"v-decorat…

案例21 基于Spring Boot+Redis實現圖書信息按書號存儲案例

1. 案例需求 基于Spring BootRedis實現圖書信息按書號存儲和取出功能&#xff0c;數據存儲至Redis。 2. 創建Spring Boot項目 創建Spring Boot項目&#xff0c;項目名稱為springboot-redis02。 3. 選擇依賴 ? pom.xml文件內容如下所示&#xff1a; <?xml version&quo…

瀏覽器控制臺調試代碼和JavaScript控制臺方法介紹

瀏覽器控制臺調試代碼和JavaScript控制臺方法介紹 瀏覽器控制臺調試代碼 瀏覽器控制臺&#xff08;Console&#xff09;是瀏覽器提供的一個開發工具&#xff0c;用于在瀏覽器中執行和調試 JavaScript 代碼。它提供了一個交互式環境&#xff0c;可以輸入 JavaScript 代碼&#…

Qt:隱式內存共享

隱式內存共享 Many C classes in Qt use implicit data sharing to maximize resource usage and minimize copying. Implicitly shared classes are both safe and efficient when passed as arguments, because only a pointer to the data is passed around, and the data i…

C語言:每日一練(選擇+編程)

目錄 選擇題&#xff1a; 題一&#xff1a; 題二&#xff1a; 題三&#xff1a; 題四&#xff1a; 題五&#xff1a; 編程題&#xff1a; 題一&#xff1a;打印1到最大的n位數 示例1 思路一&#xff1a; 題二&#xff1a;計算日期到天數轉換 示例1 思路一&#xf…

【JVM】如何判定一個對象已死以及“標記-清除”、“標記-復制”、“標記-整理”三種垃圾收集算法

文章目錄 0、如何判定一個對象的生死&#xff1f;1、上文提到的引用又是什么1、強引用&#xff1a;2、軟引用&#xff1a;3、弱引用&#xff1a;4、虛引用&#xff1a; 2、垃圾收集算法1、標記-清除2、標記-復制優化&#xff1a;&#x1f447; 3、標記-整理 0、如何判定一個對象…

Java面向對象程序設計——知識、概念、定義及作用(簡答)

?專欄&#xff1a;《Java面向對象程序設計》學習筆記 問題是依據考綱整理的&#xff0c;稍微做了一些補充。大部分答案由GPT生成&#xff0c;部分內容摘選自書本。 內容太多了&#xff0c;目前懶得濃縮精煉了&#xff0c;以后再說吧。 如果有大佬可以幫忙精簡一些文字、補充…

R語言實現神經網絡(1)

#R語言實現神經網絡 library(neuralnet) library(caret) library(MASS) library(vcd) data(shuttle) str(shuttle)#因變量use; table1<-structable(windmagn~use,shuttle) mosaic(table1,shadingT) mosaic(use~errorvis,shuttle) prop.table(table(shuttle$use,shuttle$stab…