[英]Benchmark of Java Try/Catch Block
我知道進入一個catch區塊在執行程序時有一些顯着的成本,但是,我想知道是否進入try {}塊也有任何影響所以我開始在google中尋找一個有很多意見的答案,但沒有基准測試所有。 我發現的一些答案是:
然而他們並沒有用事實回答我的問題,所以我決定自己嘗試一下。
這就是我做的。 我有一個這種格式的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.