簡體   English   中英

Java Try / Catch Block的基准測試

[英]Benchmark of Java Try/Catch Block

我知道進入一個catch區塊在執行程序時有一些顯着的成本,但是,我想知道是否進入try {}塊也有任何影響所以我開始在google中尋找一個有很多意見的答案,但沒有基准測試所有。 我發現的一些答案是:

  1. Java try / catch性能,是否建議將try子句中的內容保持在最低限度?
  2. 嘗試Catch Performance Java
  3. Java嘗試捕獲塊

然而他們並沒有用事實回答我的問題,所以我決定自己嘗試一下。

這就是我做的。 我有一個這種格式的csv文件:

host;ip;number;date;status;email;uid;name;lastname;promo_code;

狀態之后的所有內容都是可選的,甚至沒有相應的; ,所以在解析驗證時必須要查看值是否存在,這就是我想到的try / catch問題。

我在公司里繼承的當前代碼是這樣的:

StringTokenizer st=new StringTokenizer(line,";");  
String host = st.nextToken();
String ip = st.nextToken();
String number = st.nextToken();
String date = st.nextToken();
String status = st.nextToken();                             
String email = "";
try{
    email = st.nextToken();
}catch(NoSuchElementException e){
    email = "";
}

它重復了用uid,name,lastname和promo_code為電子郵件做的事情。

我改變了一切:

if(st.hasMoreTokens()){
    email = st.nextToken();
}

事實上它表現得更快。 解析沒有可選列的文件時。 以下是平均時間:

 --- Trying:122 milliseconds
 --- Checking:33 milliseconds

然而,這就是讓我感到困惑的原因和我要問的原因:當在CSV的所有8000行中運行帶有可選列值的示例時,if()版本仍然比try / catch版本表現更好,所以我的問題是

try塊是否真的對我的代碼沒有任何性能影響?

此示例的平均時間為:

--- Trying:105 milliseconds
--- Checking:43 milliseconds

有人能解釋一下這里發生了什么嗎?

非常感謝

是的,嘗試(在Java中)沒有任何性能影響。 編譯器不為try塊生成VM語句。 它只記錄try塊處於活動狀態的程序計數器,並將此信息附加到類文件中的方法。 然后,當拋出異常時,VM展開堆棧並在每個幀檢查該幀中的程序計數器是否在相關的try塊中。 這(與構建堆棧跟蹤一起)非常昂貴,因此捕獲成本很高。 但是,嘗試是免費的:)。

但是,對常規控制流使用異常仍然不是好的做法。

您的代碼執行速度更快的原因可能是捕獲成本非常高,以至於通過簡單的嘗試替換支票可以節省時間。

嘗試catch可以在代碼中更快地觸發catch,例如,如果你進入try 10000次但只捕獲一次,try方法將比if-check更快。 盡管如此,這並不是一種好的風格,而且你明確檢查更多代幣的方式也是首選。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM