So che entrare in un blocco catch ha un costo significativo quando si esegue un programma, tuttavia, mi chiedevo se l'inserimento di un blocco try {} avrebbe avuto un impatto, quindi ho iniziato a cercare una risposta in google con molte opinioni, ma nessun benchmarking. Alcune risposte che ho trovato sono stati:Benchmark di Java Try/Catch Block
- Java try/catch performance, is it recommended to keep what is inside the try clause to a minimum?
- Try Catch Performance Java
- Java try catch blocks
Tuttavia, essi non hanno risposto alla mia domanda con i fatti, così ho deciso di provare per me.
Ecco cosa ho fatto. Ho un file CSV con questo formato:
host;ip;number;date;status;email;uid;name;lastname;promo_code;
dove tutto dopo lo stato è facoltativo e non avrà nemmeno la corrispondente; quindi, quando si analizza una convalida per verificare se il valore è presente, ecco dove mi è venuto in mente il problema try/catch.
Il codice attuale, che ho ereditato nella mia azienda fa questo:
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 = "";
}
e ripete ciò che è fatto per la posta elettronica con uid, nome, cognome e promo_code.
e ho cambiato tutto per:
if(st.hasMoreTokens()){
email = st.nextToken();
}
e in effetti esegue più veloce. Durante l'analisi di un file che non ha le colonne opzionali. Qui ci sono i tempi medi:
--- Trying:122 milliseconds
--- Checking:33 milliseconds
però, ecco quello che io e la ragione per cui sto chiedendo confuso: Quando si esegue l'esempio con i valori per le colonne opzionali in tutte le 8000 linee del CSV, la versione se() esibisce ancora migliore rispetto alla versione try/catch, quindi la mia domanda è
fa davvero il blocco try non hai alcun impatto sulle prestazioni sul mio codice?
I tempi medi per questo esempio sono:
--- Trying:105 milliseconds
--- Checking:43 milliseconds
Qualcuno può spiegare cosa sta succedendo qui?
Grazie mille
ogni volta che si verifica la condizione si rallenta il programma. Non è una buona idea avere più istruzioni IF. Il tuo approccio aziendale sembra comprensibile. Ogni volta che vengono sollevati errori, puoi avere un blocco catch per vedere di cosa si tratta. –
Non vorrei secondarlo. Nel suo caso, l'email è facoltativa, quindi 'st' non avere più token non è un caso eccezionale, ma può accadere molto spesso. Usare un'eccezione qui non è un buon stile. – gexicide
Non solo accadrà molto spesso, è il comportamento predefinito. Avremo solo i campi opzionali in molte piccole occasioni – hectorg87