an-cabal/an-rope

Tracking issue for Rope performance optimisation

Opened this issue · 3 comments

hawkw commented

Continuing the discussion from #34.

hawkw commented

Commit adds support for tendril to the main (mutable) Rope.
IGNORE THE PERF NUMBERS HERE THEY WERE WRONG

hawkw commented

Current performance:

  • without tendril, without rebalance:
test tests::insert::rope::at_3quarter::char_long    ... bench:         341 ns/iter (+/- 51)
test tests::insert::rope::at_3quarter::char_short   ... bench:         299 ns/iter (+/- 89)
test tests::insert::rope::at_3quarter::long         ... bench:         256 ns/iter (+/- 45)
test tests::insert::rope::at_3quarter::rope_short   ... bench:         414 ns/iter (+/- 105)
test tests::insert::rope::at_3quarter::short        ... bench:         221 ns/iter (+/- 103)
test tests::insert::rope::at_end::char_long         ... bench:         302 ns/iter (+/- 36)
test tests::insert::rope::at_end::char_short        ... bench:         295 ns/iter (+/- 107)
test tests::insert::rope::at_end::long              ... bench:         243 ns/iter (+/- 60)
test tests::insert::rope::at_end::rope_short        ... bench:         459 ns/iter (+/- 97)
test tests::insert::rope::at_end::short             ... bench:         257 ns/iter (+/- 75)
test tests::insert::rope::at_half::char_long        ... bench:         273 ns/iter (+/- 83)
test tests::insert::rope::at_half::char_short       ... bench:         269 ns/iter (+/- 153)
test tests::insert::rope::at_half::long             ... bench:         218 ns/iter (+/- 62)
test tests::insert::rope::at_half::rope_short       ... bench:         383 ns/iter (+/- 131)
test tests::insert::rope::at_half::short            ... bench:         218 ns/iter (+/- 62)
test tests::insert::rope::at_quarter::char_long     ... bench:         299 ns/iter (+/- 87)
test tests::insert::rope::at_quarter::char_short    ... bench:         256 ns/iter (+/- 72)
test tests::insert::rope::at_quarter::long          ... bench:         219 ns/iter (+/- 77)
test tests::insert::rope::at_quarter::rope_short    ... bench:         400 ns/iter (+/- 65)
test tests::insert::rope::at_quarter::short         ... bench:         218 ns/iter (+/- 89)
test tests::insert::rope::at_start::char_long       ... bench:         113 ns/iter (+/- 33)
test tests::insert::rope::at_start::char_short      ... bench:          87 ns/iter (+/- 17)
test tests::insert::rope::at_start::long            ... bench:          88 ns/iter (+/- 30)
test tests::insert::rope::at_start::rope_short      ... bench:         247 ns/iter (+/- 47)
test tests::insert::rope::at_start::short           ... bench:          86 ns/iter (+/- 21)
test tests::insert::string::at_3quarter::char_long  ... bench:       1,573 ns/iter (+/- 351)
test tests::insert::string::at_3quarter::char_short ... bench:         687 ns/iter (+/- 180)
test tests::insert::string::at_3quarter::long       ... bench:       3,748 ns/iter (+/- 684)
test tests::insert::string::at_3quarter::short      ... bench:       1,684 ns/iter (+/- 169)
test tests::insert::string::at_end::char_long       ... bench:       1,375 ns/iter (+/- 280)
test tests::insert::string::at_end::char_short      ... bench:         917 ns/iter (+/- 105)
test tests::insert::string::at_end::long            ... bench:       3,617 ns/iter (+/- 215)
test tests::insert::string::at_end::short           ... bench:         670 ns/iter (+/- 108)
test tests::insert::string::at_half::char_long      ... bench:       1,453 ns/iter (+/- 207)
test tests::insert::string::at_half::char_short     ... bench:         649 ns/iter (+/- 94)
test tests::insert::string::at_half::long           ... bench:       1,677 ns/iter (+/- 297)
test tests::insert::string::at_half::short          ... bench:       1,343 ns/iter (+/- 147)
test tests::insert::string::at_quarter::char_long   ... bench:       2,161 ns/iter (+/- 565)
test tests::insert::string::at_quarter::char_short  ... bench:         167 ns/iter (+/- 63)
test tests::insert::string::at_quarter::long        ... bench:       2,213 ns/iter (+/- 67)
test tests::insert::string::at_quarter::short       ... bench:         617 ns/iter (+/- 108)
test tests::insert::string::at_start::char_long     ... bench:       2,864 ns/iter (+/- 743)
test tests::insert::string::at_start::char_short    ... bench:       1,633 ns/iter (+/- 142)
test tests::insert::string::at_start::long          ... bench:       3,329 ns/iter (+/- 694)
test tests::insert::string::at_start::short         ... bench:       1,291 ns/iter (+/- 114)
test tests::rope_add_1000                           ... bench:     104,953 ns/iter (+/- 32,329)
test tests::rope_insert_1000                        ... bench:     316,117 ns/iter (+/- 54,065)
test tests::split::at_3quarter::long                ... bench:       7,612 ns/iter (+/- 3,032)
test tests::split::at_3quarter::short               ... bench:         103 ns/iter (+/- 14)
test tests::split::at_end::long                     ... bench:       7,531 ns/iter (+/- 1,400)
test tests::split::at_end::short                    ... bench:          84 ns/iter (+/- 8)
test tests::split::at_half::long                    ... bench:       7,792 ns/iter (+/- 999)
test tests::split::at_half::short                   ... bench:         103 ns/iter (+/- 28)
test tests::split::at_quarter::long                 ... bench:       7,693 ns/iter (+/- 1,696)
test tests::split::at_quarter::short                ... bench:         103 ns/iter (+/- 7)
test tests::split::at_start::long                   ... bench:       7,537 ns/iter (+/- 2,412)
test tests::split::at_start::short                  ... bench:          87 ns/iter (+/- 54)
test tests::string_add_1000                         ... bench:      52,712 ns/iter (+/- 12,208)
test tests::string_insert_1000                      ... bench:   3,327,353 ns/iter (+/- 475,569)
  • with tendril, without rebalance:
test tests::insert::rope::at_3quarter::char_long    ... bench:         347 ns/iter (+/- 97)
test tests::insert::rope::at_3quarter::char_short   ... bench:         321 ns/iter (+/- 104)
test tests::insert::rope::at_3quarter::long         ... bench:         283 ns/iter (+/- 252)
test tests::insert::rope::at_3quarter::rope_short   ... bench:         490 ns/iter (+/- 202)
test tests::insert::rope::at_3quarter::short        ... bench:         244 ns/iter (+/- 91)
test tests::insert::rope::at_end::char_long         ... bench:         315 ns/iter (+/- 39)
test tests::insert::rope::at_end::char_short        ... bench:         338 ns/iter (+/- 140)
test tests::insert::rope::at_end::long              ... bench:         233 ns/iter (+/- 37)
test tests::insert::rope::at_end::rope_short        ... bench:         507 ns/iter (+/- 126)
test tests::insert::rope::at_end::short             ... bench:         255 ns/iter (+/- 53)
test tests::insert::rope::at_half::char_long        ... bench:         351 ns/iter (+/- 104)
test tests::insert::rope::at_half::char_short       ... bench:         333 ns/iter (+/- 229)
test tests::insert::rope::at_half::long             ... bench:         254 ns/iter (+/- 63)
test tests::insert::rope::at_half::rope_long        ... bench:     249,130 ns/iter (+/- 81,426)
test tests::insert::rope::at_half::rope_short       ... bench:         483 ns/iter (+/- 78)
test tests::insert::rope::at_half::short            ... bench:         241 ns/iter (+/- 31)
test tests::insert::rope::at_quarter::char_long     ... bench:         330 ns/iter (+/- 52)
test tests::insert::rope::at_quarter::char_short    ... bench:         308 ns/iter (+/- 144)
test tests::insert::rope::at_quarter::long          ... bench:         247 ns/iter (+/- 128)
test tests::insert::rope::at_quarter::rope_short    ... bench:         531 ns/iter (+/- 268)
test tests::insert::rope::at_quarter::short         ... bench:         255 ns/iter (+/- 160)
test tests::insert::rope::at_start::char_long       ... bench:         140 ns/iter (+/- 48)
test tests::insert::rope::at_start::char_short      ... bench:         128 ns/iter (+/- 53)
test tests::insert::rope::at_start::long            ... bench:          87 ns/iter (+/- 19)
test tests::insert::rope::at_start::rope_short      ... bench:         306 ns/iter (+/- 146)
test tests::insert::rope::at_start::short           ... bench:          90 ns/iter (+/- 20)
test tests::insert::string::at_3quarter::char_long  ... bench:       1,657 ns/iter (+/- 173)
test tests::insert::string::at_3quarter::char_short ... bench:       1,485 ns/iter (+/- 152)
test tests::insert::string::at_3quarter::long       ... bench:       2,839 ns/iter (+/- 602)
test tests::insert::string::at_3quarter::short      ... bench:       1,510 ns/iter (+/- 227)
test tests::insert::string::at_end::char_long       ... bench:         857 ns/iter (+/- 130)
test tests::insert::string::at_end::char_short      ... bench:         866 ns/iter (+/- 129)
test tests::insert::string::at_end::long            ... bench:       4,024 ns/iter (+/- 358)
test tests::insert::string::at_end::short           ... bench:       1,368 ns/iter (+/- 216)
test tests::insert::string::at_half::char_long      ... bench:       2,003 ns/iter (+/- 441)
test tests::insert::string::at_half::char_short     ... bench:       1,608 ns/iter (+/- 168)
test tests::insert::string::at_half::long           ... bench:       3,519 ns/iter (+/- 390)
test tests::insert::string::at_half::short          ... bench:       1,813 ns/iter (+/- 212)
test tests::insert::string::at_quarter::char_long   ... bench:       2,741 ns/iter (+/- 441)
test tests::insert::string::at_quarter::char_short  ... bench:       1,596 ns/iter (+/- 149)
test tests::insert::string::at_quarter::long        ... bench:       3,489 ns/iter (+/- 695)
test tests::insert::string::at_quarter::short       ... bench:         776 ns/iter (+/- 191)
test tests::insert::string::at_start::char_long     ... bench:       3,531 ns/iter (+/- 602)
test tests::insert::string::at_start::char_short    ... bench:         500 ns/iter (+/- 134)
test tests::insert::string::at_start::long          ... bench:       4,635 ns/iter (+/- 761)
test tests::insert::string::at_start::short         ... bench:       1,690 ns/iter (+/- 170)
test tests::rope_add_1000                           ... bench:     132,734 ns/iter (+/- 24,114)
test tests::rope_insert_1000                        ... bench:     337,103 ns/iter (+/- 147,548)
test tests::split::at_3quarter::long                ... bench:       4,434 ns/iter (+/- 954)
test tests::split::at_3quarter::short               ... bench:         102 ns/iter (+/- 70)
test tests::split::at_end::long                     ... bench:       4,529 ns/iter (+/- 1,043)
test tests::split::at_end::short                    ... bench:          83 ns/iter (+/- 15)
test tests::split::at_half::long                    ... bench:       4,390 ns/iter (+/- 1,974)
test tests::split::at_half::short                   ... bench:         104 ns/iter (+/- 51)
test tests::split::at_quarter::long                 ... bench:       4,735 ns/iter (+/- 1,080)
test tests::split::at_quarter::short                ... bench:         114 ns/iter (+/- 28)
test tests::split::at_start::long                   ... bench:       4,207 ns/iter (+/- 1,081)
test tests::split::at_start::short                  ... bench:          82 ns/iter (+/- 48)
test tests::string_add_1000                         ... bench:      62,179 ns/iter (+/- 20,755)
test tests::string_insert_1000                      ... bench:   3,620,457 ns/iter (+/- 745,017)
  • with tendril, with rebalance:
  • without tendril, with rebalance:
test tests::insert::rope::at_3quarter::char_long    ... bench:      26,083 ns/iter (+/- 6,624)
test tests::insert::rope::at_3quarter::char_short   ... bench:     154,971 ns/iter (+/- 24,423)
test tests::insert::rope::at_3quarter::long         ... bench:      29,228 ns/iter (+/- 4,830)
test tests::insert::rope::at_3quarter::short        ... bench:     151,643 ns/iter (+/- 29,083)
test tests::insert::rope::at_end::char_long         ... bench:      79,919 ns/iter (+/- 10,961)
test tests::insert::rope::at_end::char_short        ... bench:     235,341 ns/iter (+/- 8,116)
test tests::insert::rope::at_end::long              ... bench:      85,981 ns/iter (+/- 3,094)
test tests::insert::rope::at_end::short             ... bench:     203,144 ns/iter (+/- 5,199)
test tests::insert::rope::at_half::char_long        ... bench:      11,413 ns/iter (+/- 1,671)
test tests::insert::rope::at_half::char_short       ... bench:     194,569 ns/iter (+/- 5,895)
test tests::insert::rope::at_half::long             ... bench:       7,377 ns/iter (+/- 297)
test tests::insert::rope::at_half::short            ... bench:     134,002 ns/iter (+/- 5,200)
test tests::insert::rope::at_quarter::char_long     ... bench:      12,632 ns/iter (+/- 2,714)
test tests::insert::rope::at_quarter::char_short    ... bench:     100,363 ns/iter (+/- 4,394)
test tests::insert::rope::at_quarter::long          ... bench:       4,987 ns/iter (+/- 1,613)
test tests::insert::rope::at_quarter::short         ... bench:     147,303 ns/iter (+/- 8,913)
test tests::insert::rope::at_start::char_long       ... bench:     104,997 ns/iter (+/- 4,148)
test tests::insert::rope::at_start::char_short      ... bench:     383,676 ns/iter (+/- 82,117)
test tests::insert::rope::at_start::long            ... bench:     149,549 ns/iter (+/- 23,105)
test tests::insert::rope::at_start::short           ... bench:      51,908 ns/iter (+/- 10,548)
test tests::insert::string::at_3quarter::char_long  ... bench:       1,158 ns/iter (+/- 281)
test tests::insert::string::at_3quarter::char_short ... bench:         782 ns/iter (+/- 229)
test tests::insert::string::at_3quarter::long       ... bench:       2,510 ns/iter (+/- 587)
test tests::insert::string::at_3quarter::short      ... bench:       1,539 ns/iter (+/- 318)
test tests::insert::string::at_end::char_long       ... bench:       1,011 ns/iter (+/- 141)
test tests::insert::string::at_end::char_short      ... bench:       1,565 ns/iter (+/- 126)
test tests::insert::string::at_end::long            ... bench:       3,056 ns/iter (+/- 344)
test tests::insert::string::at_end::short           ... bench:       1,653 ns/iter (+/- 186)
test tests::insert::string::at_half::char_long      ... bench:       1,473 ns/iter (+/- 98)
test tests::insert::string::at_half::char_short     ... bench:         666 ns/iter (+/- 102)
test tests::insert::string::at_half::long           ... bench:       1,531 ns/iter (+/- 312)
test tests::insert::string::at_half::short          ... bench:         611 ns/iter (+/- 165)
test tests::insert::string::at_quarter::char_long   ... bench:       2,168 ns/iter (+/- 656)
test tests::insert::string::at_quarter::char_short  ... bench:         526 ns/iter (+/- 135)
test tests::insert::string::at_quarter::long        ... bench:       2,251 ns/iter (+/- 504)
test tests::insert::string::at_quarter::short       ... bench:         841 ns/iter (+/- 154)
test tests::insert::string::at_start::char_long     ... bench:       2,876 ns/iter (+/- 542)
test tests::insert::string::at_start::char_short    ... bench:         769 ns/iter (+/- 124)
test tests::insert::string::at_start::long          ... bench:       3,009 ns/iter (+/- 442)
test tests::insert::string::at_start::short         ... bench:       1,735 ns/iter (+/- 154)
test tests::rope_add_1000                           ... bench:  44,619,326 ns/iter (+/- 3,162,842)
test tests::rope_insert_1000                        ... bench:  44,613,226 ns/iter (+/- 2,839,064)
test tests::split::at_3quarter::long                ... bench:       8,053 ns/iter (+/- 2,709)
test tests::split::at_3quarter::short               ... bench:         106 ns/iter (+/- 14)
test tests::split::at_end::long                     ... bench:       8,120 ns/iter (+/- 3,089)
test tests::split::at_end::short                    ... bench:          87 ns/iter (+/- 32)
test tests::split::at_half::long                    ... bench:       8,336 ns/iter (+/- 3,869)
test tests::split::at_half::short                   ... bench:         103 ns/iter (+/- 19)
test tests::split::at_quarter::long                 ... bench:       8,237 ns/iter (+/- 2,608)
test tests::split::at_quarter::short                ... bench:         102 ns/iter (+/- 30)
test tests::split::at_start::long                   ... bench:       7,821 ns/iter (+/- 1,044)
test tests::split::at_start::short                  ... bench:          90 ns/iter (+/- 19)
test tests::string_add_1000                         ... bench:      60,797 ns/iter (+/- 12,496)
test tests::string_insert_1000                      ... bench:   3,774,596 ns/iter (+/- 869,845)
hawkw commented

commit 35b4b1c improved rebalance performance significantly, but evidentially not enough