Сравнительный анализ блока Try/Catch в Java

Я знаю, что вход в блок catch имеет некоторые значительные затраты при выполнении программы, однако мне было интересно, если вход в блок try{} также оказало какое-либо влияние, поэтому я начал искать ответ в Google со многими мнениями, но без бенчмаркинга. Вот некоторые ответы, которые я нашел:

  1. Производительность try/catch в Java, рекомендуется ли сводить к минимуму то, что находится внутри предложения try?
  2. Try Catch Performance Java
  3. Блоки try catch в Java

Однако они не ответили на мой вопрос фактами, поэтому я решил попробовать сам.

Вот что я сделал.У меня есть файл csv в следующем формате:

host;ip;номер;дата;статус;email;uid;имя;фамилия;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, именем, фамилией и промо_кодом.

и я изменил все на:

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

и на самом деле он работает быстрее. При синтаксическом анализе файла, в котором нет необязательных столбцов. Вот среднее время:

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

, однако вот что меня смутило и почему я спрашиваю: при запуске примера со значениями для необязательных столбцов во всех 8000 строках CSV версия if() по-прежнему работает лучше, чем версия try/catch, поэтому мой вопрос:

Действительно ли блок try не влияет на производительность моего кода?

Среднее время для этого примера:

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

Кто-нибудь может объяснить, что здесь происходит?

Большое спасибо

8
задан Community 23 May 2017 в 12:15
поделиться