import java.text.MessageFormat;
interface Fn {
void invoke();
}
class Sample {
public Sample(final long original, final long improved) {
this.original = original;
this.improved = improved;
}
public final long original;
public final long improved;
public static Sample create(final Fn original, final Fn improved, final int size) {
final long a = System.nanoTime();
for (int i = 0; i < size; i++) {
original.invoke();
}
final long b = System.nanoTime();
for (int i = 0; i < size; i++) {
improved.invoke();
}
final long c = System.nanoTime();
return new Sample(b - a, c - b);
}
public static Sample[] createMany(final Fn original, final Fn improved, final int size, final int count) {
final Sample[] samples = new Sample[count];
for (int i = 0; i < count; i++) {
samples[i] = create(original, improved, size);
}
return samples;
}
}
class Average {
public Average(final Sample[] samples) {
long original = 0;
long improved = 0;
for (int i = 0; i < samples.length; i++) {
original += samples[i].original;
improved += samples[i].improved;
}
this.original = original / samples.length;
this.improved = improved / samples.length;
}
public final long original;
public final long improved;
public String format() {
return MessageFormat.format("Original took {0}ms, improved took {1}ms (per sample).",
this.original / 1000d,
this.improved / 1000d);
}
public void print() {
System.out.println(this.format());
}
}
class Main {
public static void main(String[] args) {
new Average(Sample.createMany(() -> {
}, () -> {
for (int i = 0; i < 1000; i++) {}
}, 5, 500_000)).print();
}
}