#chiroito ’s blog

Java を中心とした趣味の技術について

Infinispan のライブラリモードでget/putの性能測定

Infinispan をライブラリモードで動かした時の、実行回数をスレッド数を変えて性能測定してみました。

環境

Lenovo X1 Xtremeで、4コアのI5-9400H を搭載しています。

ベンチマーク

今回試した処理は get と put です。

以下が実行回数のグラフで、get は左軸、put は右軸です。数字は 100 万回を表しています。 見ると分かりますが、左軸と右軸で 10 倍違います。 スレッド数が増えるに従ってきちんとスケールしているのが分かります。 4スレッドでput も500万回実行できているのを見るとRDBMSと比べ圧倒的に更新できることが分かります。

f:id:chiroito:20200316191820p:plain

ソースコード

ベンチマークに使用した 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");
    }
}