[
https://issues.apache.org/jira/browse/CASSANDRA-9988?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15833718#comment-15833718
]
Jay Zhuang commented on CASSANDRA-9988:
---------------------------------------
[Patch|https://github.com/cooldoger/cassandra/commit/8704eb8bbf94d5b556f67386d464a015ca98554b]
is ready, please review.
Here is the JMH test result before and after the patch, overall it
significantly improved the iterator for small BTree:
|| || Before the patch || After the patch || Improvement ||
| iteratorBigTreeTest | 171.271 | 167.288 | -2% |
| searchBigTreeTest | 12743.251 | 11833.277 | -7% |
| searchNotFoundBigTreeTest | 11140.872 | 10378.794 | -7% |
| iteratorLeafTreeTest | 5337.291 | 19788.253 | +271% |
| searchFoundLeafTreeTest | 18608.504 | 36809.601 | +98% |
| searchNotFoundLeafTreeTest | 19670.935 | 28880.540 | +47% |
| iteratorOneElemTreeTest | 65983.946 | 414832.010 | +529% |
| searchFoundOneElemTreeTest | 45796.932 | 288174.238 | +529% |
| searchNotFoundOneElemTreeTest | 43176.354 | 284008.493 | +558% |
Here is the code for JMH test without fix:
https://github.com/cooldoger/cassandra/tree/9988-nofix
I tried exponential search:
https://github.com/cooldoger/cassandra/commit/a23a3422a894acb72a47975da035bbf8da50fc4b
But the JMH test result is worse (other tests didn't change too much):
|| || Binary search || Exponential search || Improvement ||
| searchFoundLeafTreeTest | 36809.601 | 30074.161 | -18% |
| searchNotFoundLeafTreeTest | 28880.540 | 24540.700 | -15% |
| searchFoundOneElemTreeTest | 288174.238 | 233786.942 | -19% |
| searchNotFoundOneElemTreeTest | 284008.493 | 199549.589 | -30% |
Here are the JMH test results:
{noformat}
No Fix
[java] Benchmark Mode Cnt
Score Error Units
[java] BTreeSearchIteratorBench.iteratorBigTreeTest thrpt 40
171.271 ? 3.872 ops/ms
[java] BTreeSearchIteratorBench.iteratorLeafTreeTest thrpt 40
5337.291 ? 306.129 ops/ms
[java] BTreeSearchIteratorBench.iteratorOneElemTreeTest thrpt 40
65983.946 ? 10651.607 ops/ms
[java] BTreeSearchIteratorBench.searchBigTreeTest thrpt 40
12743.251 ? 1171.717 ops/ms
[java] BTreeSearchIteratorBench.searchFoundLeafTreeTest thrpt 40
18608.504 ? 1671.129 ops/ms
[java] BTreeSearchIteratorBench.searchFoundOneElemTreeTest thrpt 40
45796.932 ? 6543.235 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundBigTreeTest thrpt 40
11140.872 ? 1355.109 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundLeafTreeTest thrpt 40
19670.935 ? 1775.676 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundOneElemTreeTest thrpt 40
43176.354 ? 6862.149 ops/ms
Fix [Binary Search]
[java] Benchmark Mode Cnt
Score Error Units
[java] BTreeSearchIteratorBench.iteratorBigFullTreeTest thrpt 40
147.093 ? 7.968 ops/ms
[java] BTreeSearchIteratorBench.iteratorBigTreeTest thrpt 40
167.288 ? 4.029 ops/ms
[java] BTreeSearchIteratorBench.iteratorLeafTreeTest thrpt 40
19788.253 ? 887.529 ops/ms
[java] BTreeSearchIteratorBench.iteratorOneElemTreeTest thrpt 40
414832.010 ? 16663.043 ops/ms
[java] BTreeSearchIteratorBench.searchBigTreeTest thrpt 40
11833.277 ? 1290.791 ops/ms
[java] BTreeSearchIteratorBench.searchFoundLeafTreeTest thrpt 40
36809.601 ? 2403.004 ops/ms
[java] BTreeSearchIteratorBench.searchFoundOneElemTreeTest thrpt 40
288174.238 ? 11618.352 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundBigTreeTest thrpt 40
10378.794 ? 1229.196 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundLeafTreeTest thrpt 40
28880.540 ? 1875.317 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundOneElemTreeTest thrpt 40
284008.493 ? 7929.286 ops/ms
Fix [Exponential search]
[java] Benchmark Mode Cnt
Score Error Units
[java] BTreeSearchIteratorBench.iteratorBigFullTreeTest thrpt 40
164.849 ? 3.571 ops/ms
[java] BTreeSearchIteratorBench.iteratorBigTreeTest thrpt 40
161.228 ? 6.219 ops/ms
[java] BTreeSearchIteratorBench.iteratorLeafTreeTest thrpt 40
19828.490 ? 727.999 ops/ms
[java] BTreeSearchIteratorBench.iteratorOneElemTreeTest thrpt 40
397640.373 ? 18525.227 ops/ms
[java] BTreeSearchIteratorBench.searchBigTreeTest thrpt 40
11816.892 ? 1305.738 ops/ms
[java] BTreeSearchIteratorBench.searchFoundLeafTreeTest thrpt 40
30074.161 ? 1916.827 ops/ms
[java] BTreeSearchIteratorBench.searchFoundOneElemTreeTest thrpt 40
233786.942 ? 6960.706 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundBigTreeTest thrpt 40
11014.239 ? 1323.596 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundLeafTreeTest thrpt 40
24540.700 ? 1596.072 ops/ms
[java] BTreeSearchIteratorBench.searchNotFoundOneElemTreeTest thrpt 40
199549.589 ? 7523.028 ops/ms
{noformat}
> Introduce leaf-only iterator
> ----------------------------
>
> Key: CASSANDRA-9988
> URL: https://issues.apache.org/jira/browse/CASSANDRA-9988
> Project: Cassandra
> Issue Type: Sub-task
> Reporter: Benedict
> Assignee: Jay Zhuang
> Priority: Minor
> Labels: patch
> Fix For: 4.0
>
> Attachments: 9988-trunk-new.txt, trunk-9988.txt
>
>
> In many cases we have small btrees, small enough to fit in a single leaf
> page. In this case it _may_ be more efficient to specialise our iterator.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)