Je cours des tests de performance sur une implémentation de collection personnalisée avec JMH.Repères asymétriques dans JMH
Je voudrais imiter un scénario, où le nombre de lectures est 10 fois plus grand que le nombre d'écritures.
I utilisé this exemple de référence asymétrique et a créé un groupe de 10 fils de lecture et d'écriture fil 1:
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Group("g0")
@GroupThreads(1)
public void baselinePut0(CacheState0 state) { writing }
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Group("g0")
@GroupThreads(10)
public Integer baselineGet0(CacheState0 state) { reading }
je lance le test avec -wi 10 -i 10 -f 1
params. Dans un rapport, la variable cnt
est identique pour tous les points de référence:
Benchmark Mode Cnt Score Error Units
Benchmark.g0 avgt 10 262,537 ? 215,406 us/op
Benchmark.g0:baselineGet0 avgt 10 2,101 ? 0,154 us/op
Benchmark.g0:baselinePut0 avgt 10 1252,231 ? 697,807 us/op
Est-ce que cela signifie que nombre de lectures était égal au nombre d'écritures dans l'expérience? Si oui, comment l'implémenter correctement? Et plus général: ai-je oublié quelque chose dans cette configuration?
À moins que vous * vraiment * besoin d'obtenir les mesures séparées pour les lectures/écritures, je préfère aller avec un test symétrique (aléatoire) qui jette le dé soutenu par ThreadLocalRandom s'il doit faire une lecture ou une écriture. De cette façon, vous équilibrez le mélange d'opérations avec plus d'attention et ne dépendez pas de la planification des threads. Vous ne courez pas sur la machine qui peut accueillir 11 threads en cours d'exécution sans se marcher les uns sur les autres, êtes-vous? ;) –