JMH Benchmark - Operation vor jedem Benchmark

Hey, ich habe vor einigen Wochen eine Library zum Schreiben von Group4 komprimierten TIFF-Bildern geschrieben und wollte diese nun mit zwei anderen Libraries vergleichen (Java Advanced Imaging und Twelve Monkeys).

Also neues Maven Projekt angelegt und die JMH Dependencies eingefügt. Jetzt habe ich drei Benchmark Methoden die jeweils mit einer Library das gleiche Bild speichern sollen.
Ungefähr so:

    public void twelveMonkeys(BufferedImage b) {

    }

    //@Benchmark
    public void advancedImaging(BufferedImage b) {

    }

    //@Benchmark
    public void tiffCreator(BufferedImage b) {

    }```

Das Dekodieren des Files innerhalb des Benchmarks macht ja eig. keinen Sinn, da je nach Auslastung der Festplatte etc. der FileIO unterschiedlich lange dauert und ich somit nicht wirklich die Dauer des reinen Komprimierens messe. 

Deshalb möchte ich eig., dass das Bild vorher einmal dekodiert wird und dann das BufferedImage an alle Methoden übergeben wird, sodass das Dekodieren nicht in die Zeit für den Benchmark fällt. 
Ist das möglich sowas mit JMH irgendwie einzustellen? 


Optimalerweise sowas wie: 
```        File samplePictures = new File("Beispielpfad");
        File[] pics = samplePictures.listFiles();

        for (File f : pics) {
            BufferedImage bufferedImage = ImageIO.read(f);
            fuehreBenchmarksMitAktuellemBildAus();
        }

Hoffe da kennt sich jemand besser aus als ich :wink:

Grüße

#Edit: Das „@Benchmark“ hab ich jetzt als Kommentar eingefügt, weil das sonst immer automatisch umgewandelt wird :confused:

Warum keine List als statische Variable anlegen?


private static List<BufferedImage> getImages(String path) {
  List<BufferedImages> images = new ArrayList<>();
  File samplePictures = new File(path);
  File[] pics = samplePictures.listFiles();
  for (File f : pics) {
    images.add(ImageIO.read(f));
  }
  return images;
}

 @ben chmark
public void twelveMonkeys() {
  for(BufferedImage image: testImages) {
    twelveMonkeys(Image);
  } 
}

// Ohne Annotation
public void twelveMonkeys(BufferedImage b) {
  // Ausführen des Benchmarks
}

Das wäre so die ganz unbedarfte Idee.

Wenn man sich aber http://tutorials.jenkov.com/java-performance/jmh.html anschaut, dann gibt es da noch insbesondere State, State Scope und darin die Annotationen Setup und Teardown, mit denen man solche vorbereitenden Maßnahmen vornehmen und aus der Benchmark Messung ausklammern kann.

Sorry, war etwas im Stress und hatte meinen Thread etwas vergessen.

Mit Setup funktioniert es tatsächlich, das Problem dass ich hatte, war allerdings, dass das Setup nur einmalig ausgeführt wurde und nicht vor jeder Iteration.
Hab dann gesehen, dass man das anpassen kann:

    @Setup(Level.Invocation)
    public void init() throws IOException {
         //...
    }

und jetzt läufts wie gewollt :slight_smile: