微信微網(wǎng)站教程電商運(yùn)營推廣是做什么的
目錄
- 一、參考資料(建議閱讀)
- 二、值得思考的幾個(gè)問題
- 1、perf使用不同的性能事件進(jìn)行統(tǒng)計(jì)有什么區(qū)別呢?
- 2、那使用不同的性能事件統(tǒng)計(jì)出來的數(shù)據(jù)?排序是如何決定的,其中的百分比數(shù)值在不同的性能事件進(jìn)行統(tǒng)計(jì)時(shí)各自的意義又是什么?
- 3、perf的 計(jì)數(shù)模式 與采樣模式
- 三、CPU部分性能指標(biāo)解釋
- 1、EXC_RETURN:異常返回次數(shù)
- 2、EXC_TAKEN:發(fā)生的異常次數(shù)
- 3、branch-misses
- 4、如何減少程序執(zhí)行過程中出現(xiàn)的缺頁異常?
一、參考資料(建議閱讀)
??(1)程序員性能之道,從使用perf開始!
??(2)手把手教你系統(tǒng)級(jí)性能分析工具perf的介紹與使用(超詳細(xì))
??(3)perf優(yōu)化cache實(shí)例
二、值得思考的幾個(gè)問題
1、perf使用不同的性能事件進(jìn)行統(tǒng)計(jì)有什么區(qū)別呢?
??在使用 perf
進(jìn)行性能分析時(shí),可以選擇不同的性能事件進(jìn)行統(tǒng)計(jì),每個(gè)事件都提供了不同類型的性能信息。選擇不同的性能事件可以幫助你重點(diǎn)關(guān)注特定的性能方面,以下是一些常見的性能事件及其區(qū)別的示例:
??1)CPU周期數(shù)(CPU cycles):這個(gè)事件跟蹤了 CPU 執(zhí)行指令的周期數(shù),可以用來評(píng)估程序的執(zhí)行效率和指令的優(yōu)化情況。比較 CPU 周期數(shù)可以幫助你發(fā)現(xiàn)某個(gè)程序瓶頸在于執(zhí)行時(shí)間較長的代碼段。
??2)指令數(shù)(Instructions):這個(gè)事件跟蹤了執(zhí)行的指令數(shù)量,可以幫助你評(píng)估程序的指令級(jí)別的性能。指令數(shù)高的代碼段可能是 CPU 密集型的部分。
??3)緩存相關(guān)事件(Cache-related events):包括緩存命中率、緩存失效等相關(guān)事件。緩存相關(guān)事件可以幫助你了解程序?qū)彺娴氖褂们闆r,如緩存的命中效率、緩存失效引起的開銷,從而針對(duì)性地優(yōu)化程序的內(nèi)存訪問模式。
??4)分支預(yù)測失誤(Branch mispredictions):這個(gè)事件跟蹤了分支預(yù)測錯(cuò)誤的次數(shù),分支預(yù)測錯(cuò)誤會(huì)導(dǎo)致流水線中斷和指令重排,從而影響程序的性能。
??5) 缺頁中斷(Page faults):這個(gè)事件跟蹤了缺頁中斷的次數(shù),缺頁中斷通常表示內(nèi)存訪問受限,可以用來評(píng)估程序的內(nèi)存訪問模式和資源利用情況。
??選擇不同的性能事件可以讓你聚焦于特定的性能方面,以便更好地發(fā)現(xiàn)問題和進(jìn)行優(yōu)化。通過觀察不同性能事件的統(tǒng)計(jì)數(shù)據(jù),你可以了解程序在各個(gè)方面的狀況,并找到需要改進(jìn)的地方。根據(jù)具體的應(yīng)用場景,選擇適合的性能事件能夠更精確地分析和優(yōu)化程序的性能表現(xiàn)。
2、那使用不同的性能事件統(tǒng)計(jì)出來的數(shù)據(jù)?排序是如何決定的,其中的百分比數(shù)值在不同的性能事件進(jìn)行統(tǒng)計(jì)時(shí)各自的意義又是什么?
??在 perf
工具中,數(shù)據(jù)的分析和排序是根據(jù)所選擇的性能事件和相關(guān)指標(biāo)來進(jìn)行的,不同的性能事件和指標(biāo)可以提供不同的視角和信息。以下是一些常見的方法和概念,用于分析 perf
收集的性能數(shù)據(jù):
??1)排序方式:perf
默認(rèn)使用性能事件的計(jì)數(shù)值來排序,即按照事件發(fā)生的頻率或數(shù)量進(jìn)行排序。你可以通過 -s
或 --sort
參數(shù)來改變排序方式,例如 -s cpu
表示按照 CPU 占用排序,-s dso
表示按照動(dòng)態(tài)共享對(duì)象排序。
??2) DSO(Dynamic Shared Object):perf
默認(rèn)按照動(dòng)態(tài)共享對(duì)象來分組和排序,動(dòng)態(tài)共享對(duì)象是程序在運(yùn)行時(shí)使用的共享庫。通過對(duì) DSO 進(jìn)行排序,可以看到各個(gè)共享庫對(duì)性能的貢獻(xiàn),幫助你定位問題并進(jìn)行優(yōu)化。
??3)百分比數(shù)值:perf
輸出中的百分比數(shù)值通常表示該事件在總體中的占比。例如,如果一個(gè)函數(shù)的 CPU 使用時(shí)間占總 CPU 使用時(shí)間的 10%,則會(huì)顯示為 10.00%。你可以根據(jù)百分比數(shù)值來確定相對(duì)重要性,找到有影響的代碼段和函數(shù)。
??4)熱點(diǎn)函數(shù)/代碼段:通過觀察排序后的性能數(shù)據(jù),你可以找到熱點(diǎn)函數(shù)或代碼段,即最耗費(fèi)時(shí)間或資源的部分。這些熱點(diǎn)可以成為性能優(yōu)化的關(guān)注點(diǎn),針對(duì)性地進(jìn)行修改和優(yōu)化。
??5) 調(diào)用圖(Call graph):perf
還提供了生成函數(shù)調(diào)用圖的功能,它顯示了函數(shù)之間的調(diào)用關(guān)系和調(diào)用路徑。調(diào)用圖可以幫助你理解性能問題的根源,確定函數(shù)的調(diào)用路徑和調(diào)用頻率,以及找到有潛在優(yōu)化空間的函數(shù)。
??分析 perf
收集的性能數(shù)據(jù)需要結(jié)合具體的應(yīng)用場景和問題。你可以著重關(guān)注具有高占比和頻率的性能事件,找到引起性能問題的原因,并根據(jù)結(jié)果進(jìn)行性能優(yōu)化和改進(jìn)。同時(shí),你還可以通過調(diào)用圖、堆棧信息等進(jìn)一步深入分析性能問題。記住,性能分析是一個(gè)迭代的過程,需要反復(fù)優(yōu)化和驗(yàn)證,以改善系統(tǒng)的性能與效率。
3、perf的 計(jì)數(shù)模式 與采樣模式
??計(jì)數(shù)模式
和采樣模式
可以使用相同的性能事件,但它們所提供的數(shù)據(jù)統(tǒng)計(jì)和分析方式是不同的。
??在計(jì)數(shù)模式
下,您可以指定要計(jì)數(shù)的特定性能事件,例如指令的執(zhí)行數(shù)、緩存命中數(shù)、分支預(yù)測錯(cuò)誤等。perf會(huì)實(shí)時(shí)監(jiān)測這些事件的發(fā)生次數(shù),并提供相應(yīng)的計(jì)數(shù)結(jié)果。這樣可以對(duì)事件的頻率進(jìn)行精確的計(jì)量,得到準(zhǔn)確的計(jì)數(shù)信息。
??而在采樣模式
下,您同樣可以選擇相同的性能事件來進(jìn)行采樣,以收集數(shù)據(jù)。采樣會(huì)在程序執(zhí)行過程中間隔一定的時(shí)間或事件觸發(fā)時(shí)進(jìn)行,記錄事件發(fā)生時(shí)的上下文信息,如函數(shù)調(diào)用堆棧、指令指針等。采樣會(huì)提供更詳細(xì)的數(shù)據(jù),可以用于分析熱點(diǎn)函數(shù)、調(diào)用關(guān)系、性能瓶頸等。
??雖然計(jì)數(shù)模式和采樣模式可以監(jiān)測和記錄相同的性能事件,但計(jì)數(shù)模式提供了精確的事件計(jì)數(shù),而采樣模式提供了更豐富的上下文信息。因此,在選擇模式時(shí),您需要根據(jù)具體的分析需求考慮所需的數(shù)據(jù)類型和精度。
??總結(jié)起來,計(jì)數(shù)模式和采樣模式可以使用相同的性能事件,但它們所提供的數(shù)據(jù)類型和分析方式是不同的,具體取決于您的分析目標(biāo)和準(zhǔn)確度需求。
三、CPU部分性能指標(biāo)解釋
1、EXC_RETURN:異常返回次數(shù)
??在性能分析中,異常返回(Exception returns)
是指程序中發(fā)生異常并從異常處理程序返回到正常執(zhí)行流程的次數(shù)。當(dāng)程序執(zhí)行過程中遇到異常,例如除零錯(cuò)誤
、段錯(cuò)誤
等,系統(tǒng)會(huì)檢測到異常并跳轉(zhuǎn)到相應(yīng)的異常處理程序進(jìn)行處理。當(dāng)異常處理程序完成后,程序會(huì)從異常處理程序返回到原來的執(zhí)行流程,繼續(xù)執(zhí)行。
??異常返回可以是由于程序中的異常處理邏輯導(dǎo)致的,也可以是由于外部事件(如系統(tǒng)資源不足、信號(hào)等)觸發(fā)的。異常返回次數(shù)的計(jì)數(shù)器可以幫助我們了解程序中異常的頻率和規(guī)模,以及異常處理代碼的性能影響。
??異常返回的頻率較高可能會(huì)對(duì)程序的性能產(chǎn)生不利影響,因?yàn)楫惓?huì)導(dǎo)致程序的正常執(zhí)行流程中斷,并且處理異常通常涉及額外的開銷。因此,分析異常返回次數(shù)可以幫助我們確定異常處理代碼的效率和優(yōu)化的方向,以提高程序的性能和穩(wěn)定性。
??請(qǐng)注意,異常返回次數(shù)是 perf
工具中提供的一種性能事件,你可以使用 perf
進(jìn)行性能分析,收集和分析異常返回的數(shù)據(jù),從而了解程序中異常的情況和對(duì)性能的影響。
2、EXC_TAKEN:發(fā)生的異常次數(shù)
??在性能分析中,EXC_TAKEN
事件指的是程序中發(fā)生的異常的次數(shù)。異常是在程序執(zhí)行過程中遇到的意外情況,可以是由于錯(cuò)誤的操作、無效的數(shù)據(jù)或其他不可預(yù)測的情況而引發(fā)的。
??異??梢苑譃椴煌愋?#xff0c;常見的異常類型包括但不限于以下幾種:
1. 除零錯(cuò)誤(Divide by Zero):使用除法操作時(shí)除數(shù)為零引發(fā)的異常。2. 空指針異常(Null Pointer Exception):當(dāng)代碼試圖通過空引用訪問對(duì)象的成員時(shí)引發(fā)的異常。3. 內(nèi)存訪問異常(Segmentation Fault):試圖訪問無效地址或越界的內(nèi)存區(qū)域?qū)е碌漠惓!?span id="vxwlu0yf4" class="token number">4. 數(shù)據(jù)類型異常:包括類型轉(zhuǎn)換錯(cuò)誤、越界訪問數(shù)組等數(shù)據(jù)類型相關(guān)的異常。5. 文件訪問異常:如文件不存在、權(quán)限不足等導(dǎo)致無法正常讀寫文件的異常。
??異常是破壞程序正常執(zhí)行流程的事件,應(yīng)該被正確地處理,以避免程序崩潰或產(chǎn)生其他不可預(yù)測的結(jié)果。異常的發(fā)生次數(shù)可以通過 EXC_TAKEN
事件來統(tǒng)計(jì)和分析,幫助我們了解異常的頻率和規(guī)模,進(jìn)而對(duì)異常情況進(jìn)行調(diào)試和優(yōu)化。
3、branch-misses
??branch-misses
事件計(jì)數(shù)器用于統(tǒng)計(jì)處理器分支預(yù)測(branch prediction)錯(cuò)誤(branch misprediction)的次數(shù)。當(dāng)處理器在執(zhí)行分支指令時(shí),會(huì)根據(jù)預(yù)測結(jié)果提前執(zhí)行分支的某個(gè)方向的指令,以提高指令流水線的效率。但是,在某些情況下,處理器的分支預(yù)測會(huì)出現(xiàn)錯(cuò)誤,導(dǎo)致執(zhí)行了錯(cuò)誤的分支方向。這就是分支預(yù)測錯(cuò)誤(branch misprediction)。
??要優(yōu)化程序代碼以減少分支預(yù)測錯(cuò)誤(branch-misses)的發(fā)生,可以考慮以下幾個(gè)方面:
??分支預(yù)測友好的編碼風(fēng)格
:盡量使用順序執(zhí)行的代碼結(jié)構(gòu),避免復(fù)雜的條件分支和嵌套。簡化程序流程可以減少分支預(yù)測錯(cuò)誤的機(jī)會(huì)。
??避免頻繁的分支跳轉(zhuǎn)
:過多的分支跳轉(zhuǎn)會(huì)增加分支預(yù)測錯(cuò)誤的幾率??梢酝ㄟ^重構(gòu)代碼,減少不必要的分支跳轉(zhuǎn),例如合并相鄰的條件判斷,展開循環(huán)等。
??提高代碼局部性
:盡量保持代碼的局部性,減少分支發(fā)生的頻率和深度。可以通過適當(dāng)?shù)难h(huán)展開、代碼重排等技術(shù)來優(yōu)化代碼的局部性。
??使用邏輯運(yùn)算替代條件分支
:在某些情況下,可以使用邏輯運(yùn)算符(如 &&、||)代替條件分支語句,以減少分支預(yù)測錯(cuò)誤的機(jī)會(huì)。
??減小分支預(yù)測錯(cuò)誤的影響
:分支預(yù)測錯(cuò)誤的影響主要體現(xiàn)在指令流水線的停頓。可以通過優(yōu)化指令調(diào)度、減少依賴關(guān)系等手段來降低分支預(yù)測錯(cuò)誤對(duì)程序性能的影響。
??使用程序注解和優(yōu)化指令
:某些編程語言和編譯器提供了特殊的注解或優(yōu)化指令,用于提供分支預(yù)測的相關(guān)信息??梢栽谶m當(dāng)?shù)牡胤绞褂眠@些特性,幫助編譯器更好地進(jìn)行優(yōu)化和預(yù)測。
??利用硬件分支預(yù)測特性
:現(xiàn)代處理器通常具備硬件分支預(yù)測機(jī)制,并提供了針對(duì)分支預(yù)測錯(cuò)誤的優(yōu)化技術(shù)??梢钥紤]利用特定的處理器指令或優(yōu)化策略來最大程度地利用硬件分支預(yù)測。
??需要注意的是,分支預(yù)測錯(cuò)誤的優(yōu)化是一個(gè)復(fù)雜而細(xì)微的過程,具體的優(yōu)化策略可能因程序的特征和目標(biāo)平臺(tái)的不同而異。建議使用性能分析工具(如perf)來分析程序的熱點(diǎn)代碼和分支預(yù)測錯(cuò)誤的情況,并根據(jù)具體情況進(jìn)行針對(duì)性的優(yōu)化。
4、如何減少程序執(zhí)行過程中出現(xiàn)的缺頁異常?
??要減少程序執(zhí)行過程中的缺頁異常(Page Faults),可以采取以下幾個(gè)措施:
??內(nèi)存訪問模式優(yōu)化
:缺頁異常通常是由于內(nèi)存訪問模式不合理導(dǎo)致的,例如頻繁地訪問不在內(nèi)存中的頁。通過優(yōu)化內(nèi)存訪問模式,盡量避免頻繁地訪問不在內(nèi)存中的頁,可以減少缺頁異常的發(fā)生。
??數(shù)據(jù)局部性優(yōu)化
:數(shù)據(jù)局部性是指程序?qū)?shù)據(jù)的訪問呈現(xiàn)出一定的空間和時(shí)間上的局部性規(guī)律。通過合理地組織數(shù)據(jù)結(jié)構(gòu)和算法,盡量利用好數(shù)據(jù)的局部性,可以提高內(nèi)存訪問的效率,減少缺頁異常的發(fā)生。
??預(yù)讀取(Prefetching)
:預(yù)讀取技術(shù)可以在程序訪問某個(gè)數(shù)據(jù)之前,提前將其加載到緩存或內(nèi)存中。預(yù)讀取可以減少缺頁異常的發(fā)生,提高數(shù)據(jù)的可用性和訪問的效率。可以使用系統(tǒng)級(jí)別的預(yù)讀取策略,也可以在代碼中手動(dòng)進(jìn)行預(yù)讀取。
??內(nèi)存分配優(yōu)化
:合理管理內(nèi)存分配可以減少缺頁異常的發(fā)生。例如,避免過度的內(nèi)存分配和釋放,減少頻繁的內(nèi)存碎片化,可以提高內(nèi)存的利用率。
??使用大頁面(Large Pages)
:使用大頁面可以減少缺頁異常的次數(shù)。大頁面是指比傳統(tǒng)的頁面更大的內(nèi)存區(qū)域,通過減少頁表的數(shù)量,從而降低了缺頁異常的發(fā)生頻率。請(qǐng)注意,使用大頁面可能需要系統(tǒng)級(jí)別的支持,并且需要根據(jù)特定的應(yīng)用場景進(jìn)行評(píng)估和配置。
??需要根據(jù)具體的程序和系統(tǒng)環(huán)境來選擇和實(shí)施這些優(yōu)化措施。通過綜合考慮程序的訪問模式、數(shù)據(jù)局部性、內(nèi)存分配、預(yù)讀取等因素,以及實(shí)際測試和性能分析的結(jié)果,可以有效地減少缺頁異常的發(fā)生,提高程序的性能和響應(yīng)速度。
??歡迎大家指導(dǎo)和交流!如果我有任何錯(cuò)誤或遺漏,請(qǐng)立即指正,我愿意學(xué)習(xí)改進(jìn)。期待與大家一起進(jìn)步!