Infinispan をライブラリモードで動かした時の、実行回数をスレッド数を変えて性能測定してみました。
環境
Lenovo X1 Xtremeで、4コアのI5-9400H を搭載しています。
ベンチマーク
今回試した処理は get と put です。
以下が実行回数のグラフで、get は左軸、put は右軸です。数字は 100 万回を表しています。 見ると分かりますが、左軸と右軸で 10 倍違います。 スレッド数が増えるに従ってきちんとスケールしているのが分かります。 4スレッドでput も500万回実行できているのを見るとRDBMSと比べ圧倒的に更新できることが分かります。
ソースコード
ベンチマークに使用した JMH のコードは以下です。
import org.infinispan.Cache; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import java.io.IOException; import java.util.stream.IntStream; @State(Scope.Thread) public class EmbeddedCacheAccessBenchmark { private Cache<String, String> c; private EmbeddedCacheManager manager; @Setup(Level.Trial) public void setup() { manager = new DefaultCacheManager(); manager.defineConfiguration("mycache", new ConfigurationBuilder() .build()); c = manager.getCache("mycache"); c.put("key", "value"); } @TearDown public void tearDown() throws IOException { manager.close(); } public static void main(String[] args) { IntStream.rangeClosed(1, 4).forEach(i -> run(i)); } private static void run(int threadCount) { try { Options opt = new OptionsBuilder() .include(EmbeddedCacheAccessBenchmark.class.getSimpleName()) .forks(1) .warmupIterations(3) .measurementIterations(5) .threads(threadCount) .mode(Mode.Throughput) .build(); new Runner(opt).run(); } catch (RunnerException e) { e.printStackTrace(); } } @Benchmark public void put() { c.put("key", "value"); } @Benchmark public void get() { c.get("key"); } }