java JMH基准测试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);
}
实现直接取自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
MySQL查询在Datagrip中的执行时间:
1 row retrieved starting from 1 in 301ms (execution: 202ms, fetching: 99ms)
显然,我执行它的频率越高,速度就越快,但Datagrip中的最低速度是45毫秒。甚至不接近我用JMH测得的1.2ms/op
这可能是缓存问题吗?还是测量不当
共 (0) 个答案