这是基准源代码:https ://github.com/a-rog/px100data/tree/master/examples/HazelcastVsIgnite
它是我前面提到的 JDBC-ish NoSQL 框架的一部分:Px100 Data
构建和运行它:
cd <project-dir>
mvn clean package
cd target
java -cp "grid-benchmark.jar:lib/*" -Xms512m -Xmx3000m -Xss4m com.px100systems.platform.benchmark.HazelcastTest 100000
java -cp "grid-benchmark.jar:lib/*" -Xms512m -Xmx3000m -Xss4m com.px100systems.platform.benchmark.IgniteTest 100000
如您所见,我将内存限制设置得很高以避免垃圾收集。您也可以运行我自己的框架测试(请参阅 Px100DataTest.java)并与上述两个进行比较,但让我们专注于纯粹的性能。除了 Hazelcast 3.5.1 和 Ignite 1.3.3 之外,这两个测试都没有使用 Spring 或其他任何东西——目前是最新的。
基准以事务方式插入指定数量的 appr。1K 大小的记录(其中 100000 条 - 您可以增加它,但要注意内存)以 1000 条为批次(事务)。然后它执行两个按升序和降序排序的查询:总共四个。所有查询字段和 ORDER BY 都已编入索引。
我不会发布整个课程(从 GitHub 下载)。Hazelcast 查询如下所示:
PagingPredicate predicate = new PagingPredicate(
new Predicates.AndPredicate(new Predicates.LikePredicate("textField", "%Jane%"),
new Predicates.GreaterLessPredicate("id", first.getId(), false, false)),
(o1, o2) -> ((TestEntity)o1.getValue()).getId().compareTo(((TestEntity)o2.getValue()).getId()),
100);
匹配的 Ignite 查询:
SqlQuery<Object, TestEntity> query = new SqlQuery<>(TestEntity.class,
"FROM TestEntity WHERE textField LIKE '%Jane%' AND id > '" + first.getId() + "' ORDER BY id LIMIT 100");
query.setPageSize(100);
以下是在我的 2012 年 8 核 MBP 上执行的结果,内存为 8G:
榛树
Starting - used heap: 49791048 bytes
Inserting 100000 records: ....................................................................................................
Inserted all records - used heap: 580885264 bytes
Map: 100000 entries, used heap: 531094216 bytes, inserts took 5458 ms
Query 1 count: 100, time: 344 ms, heap size: 298844824 bytes
Query 2 count: 100, time: 115 ms, heap size: 454902648 bytes
Query 3 count: 100, time: 165 ms, heap size: 657153784 bytes
Query 4 count: 100, time: 106 ms, heap size: 811155544 bytes
点燃
Starting - used heap: 100261632 bytes
Inserting 100000 records: ....................................................................................................
Inserted all records - used heap: 1241999968 bytes
Cache: 100000 entries, heap size: 1141738336 bytes, inserts took 14387 ms
Query 1 count: 100, time: 222 ms, heap size: 917907456 bytes
Query 2 count: 100, time: 128 ms, heap size: 926325264 bytes
Query 3 count: 100, time: 7 ms, heap size: 926325264 bytes
Query 4 count: 100, time: 103 ms, heap size: 934743064 bytes
一个明显的区别是插入性能 - 在现实生活中很明显。但是很少有人插入 1000 条记录。通常它是一次插入或更新(保存输入的用户数据等),所以它不会打扰我。但是查询性能确实如此。大多数以数据为中心的业务软件都需要大量阅读。
注意内存消耗。Ignite 比 Hazelcast 更需要 RAM。这可以解释更好的查询性能。好吧,如果我决定使用内存网格,我应该担心内存吗?
您可以清楚地知道数据网格何时命中索引以及何时没有命中索引,它们如何缓存已编译的查询(7ms 的查询)等。我不想推测,也让您使用它,就像 Hazelcast 和Ignite 开发人员提供了一些见解。
就一般性能而言,它是可比的,如果不是低于 MySQL 的话。IMO 内存技术应该做得更好。我相信两家公司都会做笔记。
上面的结果非常接近。但是,当在 Px100 Data 和更高级别的 Px100(严重依赖索引“排序字段”进行分页)中使用时,Ignite 会领先并更适合我的框架。我主要关心查询性能。