多方分析後,這是最佳Java性能評估方法

2021-01-10 IT168

【IT168 技術】本文曾獲得OOPSLA十年最具影響力論文獎。我們看到許多論文都包含某種性能評估。正如Georges等人所說,如果沒有良好的實驗設計和嚴謹的統計數據,很難得出確鑿的結論,有時甚至還可能獲得錯誤的結論,本文是在Java性能評估的背景下完成的。

基準測試是實驗計算機科學研究和開發的核心。因此,擁有嚴格的基準測試方法是至關重要的。一個不嚴謹的方法可能會扭曲整體情況,甚至導致錯誤的結論,推動研究和開發向非生產性方向發展,或者導致一個非最優產品投放市場。

一個好的基準需要一個精心挑選,充滿動力的實驗設計。除此之外,它需要一個完善的績效評估方法。

績效評估方法需要充分處理實驗環境中的非確定性問題。而處理非確定性的常用數據分析方法在統計上往往都不夠嚴格。

在Java的上下文中,非確定性的來源包括JIT編譯,線程調度和垃圾收集等。對於在雲平臺上運行的許多基準測試來說,底層雲平臺中的非確定性也是一個重要因素。

性能評估問題

通常在發布時進行評估是一種方法,這種方法可以完成一些性能運行(,並報告最佳性能數值(最小執行時間)。例如,下圖是五個不同的垃圾收集器的性能對比。

CopyMS和GenCopy表現差不多,而SemiSpace明顯優於GenCopy。

以下是相同的實驗結果,但報告使用了95%置信區間,統計學上更嚴格的報告方法。

現在我們看到,GenCopy明顯優於CopyMS,而SemiSpace和GenCopy具有重疊置信區間,它們之間的差異可能僅僅是由於被測系統中的隨機性能變化。

在調查了50篇Java性能文章之後,作者表示對於Java性能評估使用的方法論沒有統一的意見,下表中總結了這些論文中使用的一些方法:

誤導結果的例子

假設你使用非嚴格的方法,需要從一組運行中得出單個數字,例如最佳,平均,最差等。在成對比較中,如果兩個系統之間的增量大於某個閾值,則可能會有一個有意義的性能差異θ。如果使用統計學上嚴謹的方法學和置信區間報告,可能會看到:

·重疊的間隔

·非重疊的間隔,與非嚴格的方法相同

·非重疊的間隔,與非嚴謹的方法不同

這會導致六種不同的情況,其中只有一種情況,你可以依靠非嚴謹方法的結果:

作者進行了一系列的測試,發現所有流行的方法都可能導致誤導,其中大部分替代方法的比較高達16%。即使在3%的比較中也會出現錯誤的結論。(如果你真的必須得到單一的數字,平均值和中位數會是更好的選擇)。

統計

我們主張增加統計的嚴格性來管理運行時系統,尤其是Java系統的性能評估研究。統計學上嚴格數據分析的動機是統計學,特別是置信區間,使人們能夠確定在測量中觀察到的差異是否是由於測量中的隨機波動或者由於替代方式中的實際差異相互比較而造成的。

原文中的這一部分基本上是為測試人員量身定做的迷你統計教程。如果我們能夠從每次的實驗中得到確切可重複的數字,那麼一切就變得簡單了。但事實並非這樣,非確定性的存在,使得我們不得不控制實驗與測量內容無關的騷擾事件。第一步就是捨棄極端的異常值,然後計算一個置信區間。

在每個實驗中,樣本是從潛在人口中抽取的。從這些樣本得出均值的置信區間,然後量化具有包括實際總體均值給定概率值的範圍。

定義一個置信區間 【C1,C2】,使得μ介於C1和C2之間的概率1-α,其中α是顯著性水平,(1-α)是置信水平。

90%置信區間意味著90%的可能性是潛在人口的實際分布均值處於置信區間內。對於同樣的數據,如果我們想要更確信真實的均值位於區間內,比如說95%的置信區間,那麼隨之而來的是我們需要使區間更寬。

比較替代品

到目前為止,我們知道如何計算單個系統均值的置信區間。如果我們比較兩個系統和它們的置信區間重疊,那麼我們就不能得出這樣的結論:在平均值中所看到的差異不是由於測量中的隨機波動造成的。如果置信區間不重疊,我們就得出結論,沒有證據表明差異有統計學意義。

本文給出了兩種方法差分計算置信區間的計算公式(見第3.3節)。如果這個區間包含0,我們可以在所選的置信水平上得出結論,兩者之間沒有統計上的顯著差異。

如果我們想要比較兩個以上的替代方案,那麼我們就可以使用一個叫做方差分析的技術(ANOVO)。

方差分析將一組測量中的總變化分為由於測量中的隨機波動而導致的分量和由於替代方式之間的實際差異導致的分量...如果替代之間的變化大於每個替代中的變化,可以得出結論,在替代方案之間存在統計上顯著的差異。

ANOVO測試並沒有告訴你哪一種選擇有統計學差異,如果有的話,可以使用Tukey HSD(非常不同的)測試。

在方差分析中,我們可以在一個實驗中改變一個輸入變量。多因素方差分析使你能夠研究多個輸入變量及其相互作用的影響。ANOVA(MANOVA)使你能夠在多個基準測試中得出結論。

建議

使用更複雜的分析,如多因素方差分析和MANOVA,通常會有兩個問題。首先,他們的產出通常是不直觀的,而且在許多情況下,沒有深入的統計背景,很難理解。第二,正如前面所提到的,在分析過程中所需要做的所有度量都非常耗時,以致於它變得難以處理。

因此,本文第4節介紹了一套實用但仍有統計學意義的Java性能評估建議。

相關焦點

  • 處理Java異常的9個最佳實踐
    這正是大多數Java標準資源所做的。當你在try子句中打開資源時,它將會在try塊執行後會自動關閉,或者處理異常。2.傾向於特定異常你拋出的異常越特殊,越好。一定要記住,遇到一個對你的代碼稀裡糊塗的同事,那麼或許幾個月後,你就需要調用方法來處理異常。
  • Win10在CMD下使用WinSAT進行評估電腦性能方法
    2、命令執行的過程中,WinSAT會分別評估桌面圖形性能、DirectX性能、Direct3D性能、CPU性能、內存性能、磁碟性能;
  • Java8 中用法優雅的 Stream,性能也「優雅」嗎?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫ava8的Stream API可以極大提高Java程式設計師的生產力,讓程式設計師寫出高效率、乾淨、簡潔的代碼。那麼,Stream API的性能到底如何呢,代碼整潔的背後是否意味著性能的損耗呢?
  • java集合之LinkedList源碼分析
    一、查看類的繼承關係關於Cloneable,java.io.Serializable兩個接口和為什麼沒有實現RandomAccess接口,我們上次已經說過了,如果不是很理解,請參考上一篇文章:《java集合之ArrayList源碼分析》這次重點把LinkedList源碼看一遍先簡單說明:LinkedList 內部是一個鍊表LinkedList首先會繼承AbstractSequentialList
  • 「原創」JVM系列03|Java棧—方法是如何調用的?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文是何適 JVM 修仙系列第 3 篇,文末有本系列文章匯總。上一篇介紹 Java 虛擬機結構時講到 Java 棧同 Java 方法的調用密切相關,那麼這篇就來探究下 Java 棧到底和方法的調用有什麼關係。
  • Java之File類的構造方法
    (f1);//重寫了Object類的toString方法,列印的是一個路徑:c:\Users\java\code\a.textFile f2=new File("c:\\Users\\java\\code");System.out.println(f2);
  • Java高級開發必會的50個性能優化的細節(珍藏版)
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫在JAVA程序中,性能問題的大部分原因並不在於JAVA語言,而是程序本身。養成良好的編碼習慣非常重要,能夠顯著地提升程序性能。
  • 2020年的Java程式設計師面試三件套:多線程+算法+微服務
    在該模式下,由於實例不會不一致,所以無需執行互斥處理,程序性能也能提高。本章還將講述Java語言中final的含義,並給出collections.synchronizedList及java.util.concurrent.copyonwriteArrayList的示例程序。
  • java中為什麼不推薦使用finalize,知道原因後相信你也不會用了
    java提供了一個finalize方法,可以幫助我們進行資源釋放,類似於C++中的析構函數。但是目前普遍的認識是不要使用,為什麼呢?就是因為對java虛擬機的垃圾回收有影響。這篇文章對其進行一個說明。方法是調用register_finalizer函數。此時java虛擬機一看當前有這個對象的引用,於是就不進行垃圾回收了。(3)對象開始被調用,FinalizerThread線程負責從ReferenceQueue隊列中獲取Finalizer對象。開始執行finalize方法,在執行之前,這個對象一直在堆中。
  • java集合詳解合集
    Set繼承自Collection接口,不能包含有重複元素(記住,這是整個Set類層次的共有屬性)。Set判斷兩個對象相同不是使用"=="運算符,而是根據equals方法。true,但這兩個對象的hashCode()方法返回不同的hashCode值時,這將導致HashSet會把這兩個對象保存在Hash表的不同位置,從而使對象可以添加成功,這就與Set集合的規則有些出入了。
  • Go+iris吊打Java+SpringBoot,是Java老了嗎?且慢,Vert.x有話說
    Java界的性能擔當根本就不是Spring,只是因為國內用java的web框架主要是Spring,我們才拿它來測……本次我們就請出java界的性能擔當——Vert.x,跟Iris再比一次這次的結果會比較有說服力因為iris在官網自稱自己是
  • java生成隨機數的五種方法
    Math.random() 靜態方法產生的隨機數是 0 - 1 之間的一個 double,即 0 <= random <= 1。當第一次調用 Math.random() 方法時,自動創建了一個偽隨機數生成器,實際上用的是 new java.util.Random()。當接下來繼續調用 Math.random() 方法時,就會使用這個新的偽隨機數生成器。
  • 華訊投資讀《經濟周期評估》教你三種正規的量化分析方法
    華訊投資最近愛上了讀書,今天要給廣大投資者朋友們分享一本好書——《經濟周期評估》,交給廣大投資者朋友三種正規的量化分析方法。  華訊投資發現,經濟中的每一次衰退和復甦背後都有經濟周期的驅動因素,而經濟的繁榮或蕭條常常在我們有切身感受之前就已經釋放出了信號。
  • 基於疲勞破壞的吊梁壽命評估分析
    後吊索 10. 止動銷圖1 吊具結構組成示意圖焊縫在使用環境下疲勞問題的分析方法,一般包括按疲勞強度進行安全性校核和按焊縫疲勞特性曲線進行壽命預測兩大類。前者分析方法較粗糙,但易於操作和實施,它通過將不同形式的焊接接頭進行分類,根據經驗方法及修正技術給出各種焊接結構的疲勞強度,並據此評估焊接結構的安全性,該方法無法分析得到焊縫的疲勞壽命,只能定性地判別是否存在疲勞斷裂問題。
  • 零基礎學java,常見的誤區和解決方法
    寫一篇經驗分享的文章,現在很多人學習java 第一,覺得java很難, 第二,覺得java 找工作不好找, 第三,也有人說java飽和了, 現在確實是行業的要求越來越高了, 早在07年的時候把
  • Java中ItemEvent的使用方法
    3:IteaListener接口: 重寫方法作為事件處理ItemListener接口在java. awt. event包中,該接口中只有一個方法public yoid i temStateChanged (ItemEvent e)事件源觸發ItemEvent
  • java——Scnner()類下面有幾種方法呢?
    一、Scnner類 Scnner類在java.util包中一個可以使用正則表達式來解析基本類型和字符串的簡單文本掃描器 next() 和 hasNext() 方法及其基本類型 companion 方法(如 nextInt() 和 hasNextInt())首先跳過與分隔符模式匹配的輸入,然後嘗試返回下一個標記。在等待更多輸入時 hasNext 和 next 方法都可能阻塞。hasNext 方法是否阻塞與其相關的 next 方法是否阻塞無關。
  • JAVA並發編程:並發問題的根源及主要解決方法
    CPU為了平衡與內存之間的性能差異,引入了CPU緩存,這樣CPU執行指令修改數據的時候就可以批量直接讀寫CPU緩存的內存,一個階段後再將數據寫回到內存。6.把Instance 引用地址指向內存空間(而就在這個指令完成後,線程B進入了方法)。B線程首先進入方法進行第1次instance == null判斷。
  • java.lang.nullpointerexception 怎麼解決及出現原因?-CSDN
    相信做過java開發的都遇到過java.lang.nullpointerexception異常,即是空指針異常。解決方法:定位到報空指針異常的這一行代碼,找到有"." 即有點的地方,任何有"."點的地方,都有可能報空指針異常。
  • 城市抗震彈塑性分析方法
    基於上述實際需求,我們提出採用「城市抗震彈塑性分析方法」實現高效、準確的城市建築震害模擬(圖1)。該方法基於結構動力學理論,採用完整的地震動時程記錄,對城市中每棟建築逐一開展動力彈塑性時程分析,可充分反映地震動時域和頻域特徵及建築抗震特性,比傳統方法具有明顯優勢。為實現該方法,需解決海量建築建模、高性能計算、「場地-城市效應」、高真實感可視化、次生災害預測等一系列關鍵科學問題。