JMH - Benchmarking Neo4j



我目前正在尝试使用JMH对数据库模型的两种不同实现进行基准测试,其中一种是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);    
}

实施直接取自文件

第二个数据模型的情况正好相反,它使用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。

MySQL查询在Datagrip中的执行时间:

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

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

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

您还测量了在JMH中建立与数据库的连接所需的时间,而直接与数据库交互则没有。请尝试将Connection重构为字段,并在执行性能测试之前对其进行设置。

相关内容

  • 没有找到相关文章

最新更新