我目前正在尝试使用JMH对数据库模型的2种不同实现进行基准测试,其中一个是Neo4j。

我面临的问题是,测量的时间与Neo4j浏览器中显示的时间有很大不同。

使用JMH:

Benchmark             Mode  Cnt     Score   Error  Units
Neo4j_JDBC.run        avgt       2434.298          ms/op
NEO4j_EMBEDDED.run    avgt          0.316          ms/op


在Neo4j浏览器中:

Started streaming 1 records after 2 ms and completed after 2 ms.


无论使用嵌入式服务器还是使用JDBC连接的远程服务器,查询都是相同的。

JMH代码:

@Setup
    public void setup() throws SQLException {
        con = DriverManager.getConnection("jdbc:neo4j:bolt://localhost", "neo4j", "password");
    }

    @TearDown
    public  void  tearDown() throws SQLException {
        con.close();
    }


    @Benchmark
    @BenchmarkMode(Mode.AverageTime)
    @OutputTimeUnit(TimeUnit.MILLISECONDS)
    @Measurement(iterations = 1, time = 1)
    @Fork(1)
    public void run() throws SQLException {
            String query = "query...";
            Statement st = con.createStatement();
            st.executeQuery(query);
    }


该实现直接取自the documentation

但是,第二种数据模型则相反,即使用MySQL服务器。

在DataGrip(也使用JDBC)中,“真正”的执行速度显示为〜100ms,而我的基准测试显示约为1.6ms / ops。

我的配置中缺少什么吗?

这甚至是使用不同模型对不同数据库系统进行基准测试的正确方法吗?

任何帮助表示赞赏!

编辑:我更新了JMH代码以不测量连接实例化,现在将Neo4j与MySQL进行比较时得到以下结果:

Benchmark                 Mode  Cnt   Score   Error  Units
MYSQL_JDBC.run            avgt        1.224          ms/op
Neo4j_JDBC.run            avgt       18.580          ms/op


MySQL代码与上面的代码几乎相同,只是使用了不同的JDBC URL。

Datagrip中MySQL查询的执行时间:

1 row retrieved starting from 1 in 301ms (execution: 202ms, fetching: 99ms)


显然,我执行频率越高,速度越快,但是在Datagrip中它的最低执行时间是45ms。甚至还不接近我使用JMH测量的1.2 ms / op。

可能是缓存问题?还是测量不正确?

最佳答案

您还正在测量在JMH中建立与数据库的连接所花费的时间,而与数据库直接交互则不需要。在执行性能测试之前,尝试将Connection重构为一个字段并进行设置。

关于java - JMH-对标Neo4j,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54524651/

10-10 14:28