2017-07-28 1 views
0

Comment est-ce qu'on est censé faire un benchmark des méthodes qui lancent des exceptions en utilisant jmh?Comment référencer des méthodes qui lancent des exceptions?

J'ai essayé le suivant sous JMH 1.19:

@Benchmark 
public void throwException() throws IllegalArgumentException 
{ 
    throw new IllegalArgumentException("Hard-coded exception"); 
} 

mais nous avons eu cette erreur:

# Run progress: 0.00% complete, ETA 00:02:00 
# Fork: 1 of 3 
# Warmup Iteration 1: <failure> 

java.lang.IllegalArgumentException: Hard-coded exception 
[...] 

Suis-je censé Blackhole exceptions comme suit?

@Benchmark 
public void throwException(Blackhole bh) 
{ 
    try 
    { 
     throw new IllegalArgumentException("Hard-coded exception"); 
    } 
    catch (IllegalArgumentException e) 
    { 
     bh.consume(e); 
    } 
} 

ou est-il une autre façon de dire jmh d'accepter les exceptions lancées?

+1

Lisez ce https://shipilev.net/blog/2014/exceptional-performance/ et vérifiez ce https://github.com/shipilev/article-exception-benchmarks/tree/master/src/main/java/ net/shipilev/perf/exceptions –

+0

@OlegEstekhin D'accord, mais pourquoi ça marche? Qu'est-ce qui permet à son code de lancer des exceptions alors que le mien déclenche un échec? – Gili

+0

Je pense que la différence principale est que l'exemple appelle une exception jetant la méthode, au lieu de la jeter du benchmark lui-même –

Répondre

0

Résumant les réponses que je l'ai reçu de je l'ai reçu de Kiril S. et Oleg Estekhin:

JMH toujours échouer si une méthode de référence lance une exception. Pour corriger cela, la méthode de référence doit capturer l'exception. Il peut ensuite consommer l'exception à l'aide d'un objet Blackhole ou le renvoyer à partir de la méthode benchmark. Cela empêchera le compilateur d'optimiser l'instruction throw.