-
Notifications
You must be signed in to change notification settings - Fork 62
Use HashMap for ConcreteStorage #758
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Benchmark shows significant improvements (>90% less time!) on large instances of hashmem and mapStorage; both are quite similar tests, except hashmem also exercises keccak256 Baseline from hevm main$ git checkout 9924e80dd0226c1f3e1eda651bbeb3558f419843 # base of this PR, from hevm main branch
$ git cherry-pick e82f81cc6141048eaaa99fb736d706b2e8727912 # bench commit
$ cabal run bench-perf -- --csv pr-758-base.txt +RTS -T
All
loop
2: OK (0.74s)
103 μs ± 9.3 μs, 236 KB allocated, 1.4 KB copied, 133 MB peak memory
4: OK (1.06s)
151 μs ± 14 μs, 341 KB allocated, 1.9 KB copied, 133 MB peak memory
8: OK (0.86s)
246 μs ± 14 μs, 551 KB allocated, 3.4 KB copied, 133 MB peak memory
16: OK (0.75s)
429 μs ± 35 μs, 972 KB allocated, 6.3 KB copied, 133 MB peak memory
32: OK (0.71s)
821 μs ± 71 μs, 1.8 MB allocated, 12 KB copied, 133 MB peak memory
64: OK (2.71s)
1.59 ms ± 64 μs, 3.4 MB allocated, 23 KB copied, 133 MB peak memory
128: OK (0.67s)
3.12 ms ± 259 μs, 6.7 MB allocated, 46 KB copied, 133 MB peak memory
256: OK (1.25s)
5.99 ms ± 384 μs, 13 MB allocated, 64 KB copied, 136 MB peak memory
512: OK (0.63s)
11.9 ms ± 844 μs, 26 MB allocated, 89 KB copied, 138 MB peak memory
1024: OK (1.22s)
23.7 ms ± 1.3 ms, 53 MB allocated, 141 KB copied, 138 MB peak memory
2048: OK (1.21s)
47.7 ms ± 3.2 ms, 106 MB allocated, 244 KB copied, 138 MB peak memory
4096: OK (0.58s)
94.8 ms ± 7.7 ms, 211 MB allocated, 448 KB copied, 138 MB peak memory
8192: OK (0.54s)
191 ms ± 15 ms, 422 MB allocated, 856 KB copied, 138 MB peak memory
16384: OK (0.46s)
381 ms ± 29 ms, 845 MB allocated, 1.6 MB copied, 138 MB peak memory
primes
2: OK (1.21s)
320 μs ± 24 μs, 722 KB allocated, 12 KB copied, 138 MB peak memory
4: OK (1.78s)
462 μs ± 29 μs, 1.0 MB allocated, 19 KB copied, 138 MB peak memory
8: OK (5.87s)
762 μs ± 68 μs, 1.6 MB allocated, 31 KB copied, 138 MB peak memory
16: OK (1.42s)
1.47 ms ± 53 μs, 2.9 MB allocated, 65 KB copied, 138 MB peak memory
32: OK (1.47s)
3.10 ms ± 215 μs, 6.3 MB allocated, 175 KB copied, 151 MB peak memory
64: OK (1.51s)
6.56 ms ± 447 μs, 14 MB allocated, 262 KB copied, 151 MB peak memory
128: OK (0.87s)
15.4 ms ± 1.2 ms, 31 MB allocated, 174 KB copied, 151 MB peak memory
256: OK (0.99s)
35.7 ms ± 2.3 ms, 75 MB allocated, 370 KB copied, 151 MB peak memory
512: OK (0.57s)
86.0 ms ± 7.7 ms, 182 MB allocated, 663 KB copied, 151 MB peak memory
1024: OK (0.64s)
209 ms ± 17 ms, 444 MB allocated, 1.3 MB copied, 151 MB peak memory
2048: OK (0.66s)
507 ms ± 50 ms, 1.1 GB allocated, 2.9 MB copied, 151 MB peak memory
4096: OK (3.90s)
1.298 s ± 46 ms, 2.7 GB allocated, 6.9 MB copied, 151 MB peak memory
8192: OK (4.21s)
3.243 s ± 210 ms, 6.8 GB allocated, 16 MB copied, 151 MB peak memory
16384: OK (10.50s)
8.198 s ± 406 ms, 17 GB allocated, 39 MB copied, 151 MB peak memory
hashes
2: OK (0.50s)
135 μs ± 13 μs, 328 KB allocated, 1.8 KB copied, 151 MB peak memory
4: OK (0.83s)
223 μs ± 17 μs, 525 KB allocated, 2.9 KB copied, 151 MB peak memory
8: OK (1.41s)
384 μs ± 35 μs, 917 KB allocated, 5.3 KB copied, 151 MB peak memory
16: OK (1.29s)
712 μs ± 49 μs, 1.7 MB allocated, 10 KB copied, 151 MB peak memory
32: OK (1.22s)
1.36 ms ± 129 μs, 3.2 MB allocated, 20 KB copied, 151 MB peak memory
64: OK (0.62s)
2.68 ms ± 227 μs, 6.3 MB allocated, 38 KB copied, 151 MB peak memory
128: OK (0.59s)
5.22 ms ± 475 μs, 12 MB allocated, 59 KB copied, 151 MB peak memory
256: OK (0.57s)
10.3 ms ± 874 μs, 25 MB allocated, 80 KB copied, 151 MB peak memory
512: OK (0.56s)
20.5 ms ± 1.8 ms, 49 MB allocated, 120 KB copied, 151 MB peak memory
1024: OK (1.12s)
41.5 ms ± 1.9 ms, 99 MB allocated, 199 KB copied, 151 MB peak memory
2048: OK (0.52s)
81.6 ms ± 8.1 ms, 197 MB allocated, 357 KB copied, 151 MB peak memory
4096: OK (1.05s)
163 ms ± 10 ms, 394 MB allocated, 670 KB copied, 151 MB peak memory
8192: OK (0.43s)
328 ms ± 29 ms, 786 MB allocated, 1.3 MB copied, 151 MB peak memory
16384: OK (0.84s)
654 ms ± 49 ms, 1.5 GB allocated, 2.5 MB copied, 151 MB peak memory
hashmem
2: OK (0.93s)
233 μs ± 17 μs, 506 KB allocated, 5.0 KB copied, 151 MB peak memory
4: OK (0.73s)
364 μs ± 27 μs, 795 KB allocated, 7.0 KB copied, 151 MB peak memory
8: OK (2.57s)
637 μs ± 60 μs, 1.3 MB allocated, 14 KB copied, 151 MB peak memory
16: OK (1.18s)
1.16 ms ± 76 μs, 2.5 MB allocated, 25 KB copied, 151 MB peak memory
32: OK (1.12s)
2.22 ms ± 214 μs, 4.8 MB allocated, 51 KB copied, 151 MB peak memory
64: OK (1.13s)
4.52 ms ± 430 μs, 9.6 MB allocated, 104 KB copied, 151 MB peak memory
128: OK (1.12s)
9.06 ms ± 545 μs, 20 MB allocated, 158 KB copied, 151 MB peak memory
256: OK (1.24s)
19.8 ms ± 1.1 ms, 42 MB allocated, 294 KB copied, 151 MB peak memory
512: OK (0.68s)
44.7 ms ± 3.9 ms, 93 MB allocated, 647 KB copied, 151 MB peak memory
1024: OK (0.77s)
107 ms ± 6.7 ms, 226 MB allocated, 1.5 MB copied, 151 MB peak memory
2048: OK (0.96s)
294 ms ± 26 ms, 612 MB allocated, 3.8 MB copied, 151 MB peak memory
4096: OK (3.01s)
917 ms ± 49 ms, 1.8 GB allocated, 10 MB copied, 151 MB peak memory
8192: OK (10.17s)
3.105 s ± 117 ms, 6.1 GB allocated, 31 MB copied, 151 MB peak memory
16384: OK (36.62s)
11.263 s ± 137 ms, 22 GB allocated, 94 MB copied, 151 MB peak memory
balanceTransfer
2: OK (1.72s)
110 μs ± 5.7 μs, 223 KB allocated, 1.2 KB copied, 151 MB peak memory
4: OK (0.65s)
161 μs ± 14 μs, 316 KB allocated, 1.9 KB copied, 151 MB peak memory
8: OK (1.02s)
257 μs ± 17 μs, 505 KB allocated, 3.9 KB copied, 151 MB peak memory
16: OK (1.86s)
466 μs ± 14 μs, 882 KB allocated, 9.5 KB copied, 151 MB peak memory
32: OK (3.38s)
841 μs ± 66 μs, 1.6 MB allocated, 27 KB copied, 151 MB peak memory
64: OK (0.84s)
1.66 ms ± 142 μs, 3.1 MB allocated, 88 KB copied, 151 MB peak memory
128: OK (0.83s)
3.20 ms ± 263 μs, 6.0 MB allocated, 316 KB copied, 151 MB peak memory
256: OK (0.93s)
7.18 ms ± 648 μs, 12 MB allocated, 1.3 MB copied, 151 MB peak memory
512: OK (0.93s)
14.4 ms ± 1.4 ms, 24 MB allocated, 3.4 MB copied, 151 MB peak memory
1024: OK (0.93s)
29.0 ms ± 2.7 ms, 47 MB allocated, 7.3 MB copied, 151 MB peak memory
2048: OK (0.94s)
60.2 ms ± 3.4 ms, 95 MB allocated, 16 MB copied, 152 MB peak memory
4096: OK (0.91s)
120 ms ± 6.7 ms, 189 MB allocated, 32 MB copied, 152 MB peak memory
8192: OK (1.84s)
243 ms ± 15 ms, 378 MB allocated, 68 MB copied, 202 MB peak memory
16384: OK (1.74s)
488 ms ± 31 ms, 756 MB allocated, 133 MB copied, 208 MB peak memory
funcCall
2: OK (0.66s)
172 μs ± 14 μs, 377 KB allocated, 3.4 KB copied, 222 MB peak memory
4: OK (0.97s)
249 μs ± 17 μs, 521 KB allocated, 5.2 KB copied, 222 MB peak memory
8: OK (1.66s)
412 μs ± 13 μs, 810 KB allocated, 8.6 KB copied, 222 MB peak memory
16: OK (1.49s)
739 μs ± 40 μs, 1.4 MB allocated, 16 KB copied, 222 MB peak memory
32: OK (2.65s)
1.32 ms ± 83 μs, 2.5 MB allocated, 30 KB copied, 222 MB peak memory
64: OK (1.32s)
2.62 ms ± 159 μs, 4.7 MB allocated, 58 KB copied, 222 MB peak memory
128: OK (1.21s)
4.92 ms ± 392 μs, 9.2 MB allocated, 98 KB copied, 222 MB peak memory
256: OK (1.20s)
9.77 ms ± 554 μs, 18 MB allocated, 114 KB copied, 222 MB peak memory
512: OK (0.59s)
19.1 ms ± 1.9 ms, 36 MB allocated, 150 KB copied, 222 MB peak memory
1024: OK (1.13s)
38.0 ms ± 2.3 ms, 73 MB allocated, 219 KB copied, 222 MB peak memory
2048: OK (1.11s)
74.9 ms ± 4.6 ms, 145 MB allocated, 353 KB copied, 222 MB peak memory
4096: OK (1.07s)
151 ms ± 7.1 ms, 290 MB allocated, 628 KB copied, 222 MB peak memory
8192: OK (1.00s)
301 ms ± 16 ms, 580 MB allocated, 1.2 MB copied, 222 MB peak memory
16384: OK (0.85s)
601 ms ± 44 ms, 1.1 GB allocated, 2.2 MB copied, 222 MB peak memory
contractCreation
2: OK (1.08s)
262 μs ± 20 μs, 549 KB allocated, 5.9 KB copied, 222 MB peak memory
4: OK (1.79s)
426 μs ± 35 μs, 869 KB allocated, 12 KB copied, 222 MB peak memory
8: OK (1.60s)
754 μs ± 36 μs, 1.5 MB allocated, 29 KB copied, 222 MB peak memory
16: OK (0.76s)
1.39 ms ± 127 μs, 2.7 MB allocated, 78 KB copied, 222 MB peak memory
32: OK (1.56s)
2.78 ms ± 252 μs, 5.2 MB allocated, 254 KB copied, 222 MB peak memory
64: OK (0.88s)
6.29 ms ± 476 μs, 10 MB allocated, 1.3 MB copied, 222 MB peak memory
128: OK (0.90s)
13.5 ms ± 892 μs, 20 MB allocated, 3.8 MB copied, 222 MB peak memory
256: OK (0.92s)
28.5 ms ± 2.4 ms, 40 MB allocated, 8.4 MB copied, 222 MB peak memory
512: OK (0.95s)
63.5 ms ± 4.7 ms, 82 MB allocated, 19 MB copied, 222 MB peak memory
1024: OK (1.97s)
133 ms ± 8.3 ms, 163 MB allocated, 38 MB copied, 222 MB peak memory
2048: OK (1.93s)
279 ms ± 21 ms, 325 MB allocated, 77 MB copied, 222 MB peak memory
4096: OK (1.79s)
591 ms ± 15 ms, 648 MB allocated, 148 MB copied, 349 MB peak memory
8192: OK (8.00s)
1.272 s ± 85 ms, 1.3 GB allocated, 307 MB copied, 647 MB peak memory
16384: OK (7.77s)
2.678 s ± 108 ms, 2.6 GB allocated, 648 MB copied, 1.0 GB peak memory
contractCreationMem
2: OK (1.12s)
1.07 ms ± 72 μs, 2.3 MB allocated, 96 KB copied, 1.0 GB peak memory
4: OK (1.06s)
2.00 ms ± 186 μs, 4.0 MB allocated, 252 KB copied, 1.0 GB peak memory
8: OK (1.11s)
4.02 ms ± 248 μs, 7.3 MB allocated, 931 KB copied, 1.0 GB peak memory
16: OK (1.18s)
8.88 ms ± 855 μs, 14 MB allocated, 3.0 MB copied, 1.0 GB peak memory
32: OK (1.23s)
18.5 ms ± 962 μs, 28 MB allocated, 7.1 MB copied, 1.0 GB peak memory
64: OK (0.61s)
38.3 ms ± 3.6 ms, 55 MB allocated, 16 MB copied, 1.0 GB peak memory
128: OK (1.22s)
77.1 ms ± 4.3 ms, 109 MB allocated, 32 MB copied, 1.0 GB peak memory
256: OK (0.56s)
158 ms ± 15 ms, 217 MB allocated, 65 MB copied, 1.0 GB peak memory
512: OK (1.12s)
317 ms ± 31 ms, 435 MB allocated, 135 MB copied, 1.0 GB peak memory
1024: OK (2.31s)
672 ms ± 26 ms, 871 MB allocated, 290 MB copied, 1.0 GB peak memory
2048: OK (9.85s)
1.328 s ± 50 ms, 1.7 GB allocated, 561 MB copied, 1.0 GB peak memory
4096: OK (9.31s)
2.783 s ± 234 ms, 3.4 GB allocated, 1.2 GB copied, 1.4 GB peak memory
8192: OK (18.78s)
5.584 s ± 420 ms, 6.8 GB allocated, 2.3 GB copied, 2.5 GB peak memory
16384: OK (37.85s)
11.147 s ± 317 ms, 14 GB allocated, 4.6 GB copied, 5.3 GB peak memory
arrayCreationMem
2: OK (2.11s)
540 μs ± 28 μs, 1.4 MB allocated, 22 KB copied, 5.3 GB peak memory
4: OK (1.47s)
1.58 ms ± 136 μs, 3.9 MB allocated, 67 KB copied, 5.3 GB peak memory
8: OK (1.23s)
5.38 ms ± 248 μs, 14 MB allocated, 247 KB copied, 5.3 GB peak memory
16: OK (0.55s)
19.9 ms ± 1.9 ms, 54 MB allocated, 315 KB copied, 5.3 GB peak memory
32: OK (1.01s)
76.6 ms ± 3.6 ms, 211 MB allocated, 972 KB copied, 5.3 GB peak memory
64: OK (0.90s)
302 ms ± 17 ms, 840 MB allocated, 3.1 MB copied, 5.3 GB peak memory
128: OK (1.52s)
1.198 s ± 44 ms, 3.3 GB allocated, 8.2 MB copied, 5.3 GB peak memory
256: OK (6.09s)
4.775 s ± 78 ms, 13 GB allocated, 23 MB copied, 5.3 GB peak memory
512: OK (24.14s)
19.017 s ± 125 ms, 52 GB allocated, 73 MB copied, 5.3 GB peak memory
mapStorage
2: OK (0.94s)
237 μs ± 13 μs, 532 KB allocated, 3.8 KB copied, 5.3 GB peak memory
4: OK (1.71s)
421 μs ± 24 μs, 906 KB allocated, 6.4 KB copied, 5.3 GB peak memory
8: OK (1.58s)
767 μs ± 67 μs, 1.6 MB allocated, 12 KB copied, 5.3 GB peak memory
16: OK (0.75s)
1.45 ms ± 119 μs, 3.1 MB allocated, 25 KB copied, 5.3 GB peak memory
32: OK (0.76s)
2.96 ms ± 292 μs, 6.3 MB allocated, 61 KB copied, 5.3 GB peak memory
64: OK (0.81s)
6.27 ms ± 600 μs, 13 MB allocated, 139 KB copied, 5.3 GB peak memory
128: OK (0.88s)
13.8 ms ± 1.0 ms, 28 MB allocated, 269 KB copied, 5.3 GB peak memory
256: OK (1.02s)
32.7 ms ± 2.4 ms, 67 MB allocated, 582 KB copied, 5.3 GB peak memory
512: OK (0.60s)
83.8 ms ± 8.0 ms, 174 MB allocated, 1.3 MB copied, 5.3 GB peak memory
1024: OK (0.84s)
252 ms ± 14 ms, 508 MB allocated, 3.1 MB copied, 5.3 GB peak memory
2048: OK (2.67s)
815 ms ± 23 ms, 1.6 GB allocated, 8.7 MB copied, 5.3 GB peak memory
4096: OK (3.93s)
2.840 s ± 75 ms, 5.7 GB allocated, 26 MB copied, 5.3 GB peak memory
8192: OK (14.29s)
10.554 s ± 144 ms, 21 GB allocated, 76 MB copied, 5.3 GB peak memory
16384: OK (54.24s)
40.272 s ± 733 ms, 83 GB allocated, 254 MB copied, 5.3 GB peak memory
All 135 tests passed (401.49s) Benchmark results from this PR
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks OK to me.
@msooseth, what do you think?
@elopez Do you know how much of the improvement is due to |
@blishko quite interesting, it seems both show an improvement in isolation, but when you combine them their benefit doesn't stack 🤔 Just hashmap$ cabal run bench-perf -- --baseline pr-758-base.txt -p 'mapStorage' +RTS -T
All
mapStorage
2: OK (1.88s)
238 μs ± 11 μs, 532 KB allocated, 3.1 KB copied, 134 MB peak memory, same as baseline
4: OK (0.83s)
411 μs ± 40 μs, 901 KB allocated, 6.0 KB copied, 134 MB peak memory, same as baseline
8: OK (0.76s)
743 μs ± 62 μs, 1.6 MB allocated, 12 KB copied, 134 MB peak memory, same as baseline
16: OK (0.73s)
1.42 ms ± 126 μs, 3.1 MB allocated, 23 KB copied, 134 MB peak memory, same as baseline
32: OK (1.45s)
2.82 ms ± 236 μs, 6.0 MB allocated, 59 KB copied, 134 MB peak memory, same as baseline
64: OK (0.75s)
5.76 ms ± 464 μs, 12 MB allocated, 142 KB copied, 134 MB peak memory, same as baseline
128: OK (1.55s)
11.7 ms ± 735 μs, 23 MB allocated, 247 KB copied, 134 MB peak memory, 15% less than baseline
256: OK (1.66s)
24.3 ms ± 1.1 ms, 47 MB allocated, 496 KB copied, 134 MB peak memory, 25% less than baseline
512: OK (1.84s)
52.0 ms ± 2.0 ms, 94 MB allocated, 1.0 MB copied, 134 MB peak memory, 37% less than baseline
1024: OK (1.11s)
119 ms ± 9.1 ms, 188 MB allocated, 2.4 MB copied, 134 MB peak memory, 52% less than baseline
2048: OK (3.05s)
296 ms ± 14 ms, 377 MB allocated, 5.2 MB copied, 134 MB peak memory, 63% less than baseline
4096: OK (4.19s)
785 ms ± 15 ms, 755 MB allocated, 12 MB copied, 134 MB peak memory, 72% less than baseline
8192: OK (5.96s)
2.376 s ± 79 ms, 1.5 GB allocated, 27 MB copied, 134 MB peak memory, 77% less than baseline
16384: OK (23.08s)
8.562 s ± 405 ms, 3.0 GB allocated, 59 MB copied, 134 MB peak memory, 78% less than baseline
All 14 tests passed (48.84s) Just simplifyNoLitToKeccak$ cabal run bench-perf -- --baseline pr-758-base.txt -p 'mapStorage' +RTS -T
All
mapStorage
2: OK (0.90s)
230 μs ± 17 μs, 530 KB allocated, 2.7 KB copied, 134 MB peak memory, same as baseline
4: OK (1.59s)
398 μs ± 39 μs, 898 KB allocated, 5.5 KB copied, 134 MB peak memory, same as baseline
8: OK (1.45s)
727 μs ± 26 μs, 1.6 MB allocated, 12 KB copied, 134 MB peak memory, same as baseline
16: OK (1.39s)
1.38 ms ± 99 μs, 3.0 MB allocated, 23 KB copied, 134 MB peak memory, same as baseline
32: OK (1.41s)
2.78 ms ± 107 μs, 5.9 MB allocated, 59 KB copied, 134 MB peak memory, same as baseline
64: OK (0.69s)
5.52 ms ± 465 μs, 12 MB allocated, 134 KB copied, 134 MB peak memory, 11% less than baseline
128: OK (0.69s)
11.0 ms ± 946 μs, 23 MB allocated, 250 KB copied, 134 MB peak memory, 20% less than baseline
256: OK (1.38s)
22.2 ms ± 860 μs, 47 MB allocated, 520 KB copied, 134 MB peak memory, 32% less than baseline
512: OK (1.41s)
45.3 ms ± 1.9 ms, 94 MB allocated, 1.1 MB copied, 134 MB peak memory, 45% less than baseline
1024: OK (1.39s)
90.4 ms ± 5.9 ms, 187 MB allocated, 2.4 MB copied, 134 MB peak memory, 64% less than baseline
2048: OK (1.33s)
181 ms ± 10 ms, 375 MB allocated, 5.4 MB copied, 134 MB peak memory, 77% less than baseline
4096: OK (0.54s)
362 ms ± 32 ms, 751 MB allocated, 12 MB copied, 134 MB peak memory, 87% less than baseline
8192: OK (1.09s)
730 ms ± 55 ms, 1.5 GB allocated, 26 MB copied, 134 MB peak memory, 93% less than baseline
16384: OK (2.19s)
1.469 s ± 48 ms, 2.9 GB allocated, 57 MB copied, 134 MB peak memory, 96% less than baseline
All 14 tests passed (17.45s) |
This seems to suggest that the short paths in I suggest to have a PR with only that change (plus this new test case). |
5a8c436
to
d224b99
Compare
I guess this does not make a difference now; although I find it interesting that it did offer a substantial advantage when the shortcut in I'm not opposed either way if you want to merge or close this one. Baseline from hevm main$ git checkout 0b191229 # base of this PR, from hevm main branch
$ cabal run bench-perf -- --csv pr-758-base-v2.txt +RTS -T
All
loop
2: OK (0.73s)
100 μs ± 9.0 μs, 236 KB allocated, 1.4 KB copied, 133 MB peak memory
4: OK (1.07s)
149 μs ± 12 μs, 341 KB allocated, 1.9 KB copied, 133 MB peak memory
8: OK (1.75s)
248 μs ± 13 μs, 551 KB allocated, 3.4 KB copied, 133 MB peak memory
16: OK (0.77s)
442 μs ± 35 μs, 972 KB allocated, 6.3 KB copied, 133 MB peak memory
32: OK (1.38s)
800 μs ± 30 μs, 1.8 MB allocated, 12 KB copied, 133 MB peak memory
64: OK (0.68s)
1.57 ms ± 149 μs, 3.4 MB allocated, 23 KB copied, 133 MB peak memory
128: OK (0.67s)
3.09 ms ± 233 μs, 6.7 MB allocated, 46 KB copied, 133 MB peak memory
256: OK (1.26s)
5.95 ms ± 472 μs, 13 MB allocated, 64 KB copied, 136 MB peak memory
512: OK (0.62s)
11.7 ms ± 949 μs, 26 MB allocated, 89 KB copied, 138 MB peak memory
1024: OK (1.22s)
23.6 ms ± 1.3 ms, 53 MB allocated, 141 KB copied, 138 MB peak memory
2048: OK (0.60s)
47.2 ms ± 4.4 ms, 106 MB allocated, 244 KB copied, 138 MB peak memory
4096: OK (0.58s)
93.7 ms ± 8.7 ms, 211 MB allocated, 449 KB copied, 138 MB peak memory
8192: OK (1.15s)
187 ms ± 8.9 ms, 422 MB allocated, 856 KB copied, 138 MB peak memory
16384: OK (1.06s)
378 ms ± 15 ms, 845 MB allocated, 1.6 MB copied, 138 MB peak memory
primes
2: OK (1.17s)
306 μs ± 23 μs, 721 KB allocated, 12 KB copied, 138 MB peak memory
4: OK (0.89s)
456 μs ± 34 μs, 1.0 MB allocated, 19 KB copied, 138 MB peak memory
8: OK (1.46s)
756 μs ± 55 μs, 1.6 MB allocated, 32 KB copied, 138 MB peak memory
16: OK (0.70s)
1.44 ms ± 112 μs, 2.9 MB allocated, 64 KB copied, 138 MB peak memory
32: OK (1.45s)
3.07 ms ± 293 μs, 6.2 MB allocated, 175 KB copied, 151 MB peak memory
64: OK (1.51s)
6.53 ms ± 494 μs, 14 MB allocated, 261 KB copied, 151 MB peak memory
128: OK (0.84s)
14.7 ms ± 901 μs, 31 MB allocated, 252 KB copied, 151 MB peak memory
256: OK (0.99s)
35.2 ms ± 2.0 ms, 75 MB allocated, 369 KB copied, 151 MB peak memory
512: OK (1.16s)
84.6 ms ± 4.9 ms, 181 MB allocated, 661 KB copied, 151 MB peak memory
1024: OK (0.62s)
202 ms ± 17 ms, 441 MB allocated, 1.3 MB copied, 151 MB peak memory
2048: OK (0.66s)
502 ms ± 48 ms, 1.1 GB allocated, 2.9 MB copied, 151 MB peak memory
4096: OK (1.64s)
1.254 s ± 80 ms, 2.7 GB allocated, 6.8 MB copied, 151 MB peak memory
8192: OK (4.08s)
3.143 s ± 187 ms, 6.7 GB allocated, 16 MB copied, 151 MB peak memory
16384: OK (10.34s)
8.015 s ± 341 ms, 17 GB allocated, 39 MB copied, 151 MB peak memory
hashes
2: OK (1.01s)
136 μs ± 11 μs, 328 KB allocated, 1.8 KB copied, 151 MB peak memory
4: OK (0.82s)
221 μs ± 20 μs, 525 KB allocated, 2.9 KB copied, 151 MB peak memory
8: OK (0.71s)
379 μs ± 31 μs, 917 KB allocated, 5.3 KB copied, 151 MB peak memory
16: OK (0.66s)
709 μs ± 63 μs, 1.7 MB allocated, 10 KB copied, 151 MB peak memory
32: OK (0.66s)
1.40 ms ± 127 μs, 3.2 MB allocated, 20 KB copied, 151 MB peak memory
64: OK (0.61s)
2.66 ms ± 243 μs, 6.3 MB allocated, 38 KB copied, 151 MB peak memory
128: OK (1.17s)
5.15 ms ± 288 μs, 12 MB allocated, 59 KB copied, 151 MB peak memory
256: OK (1.17s)
10.4 ms ± 662 μs, 25 MB allocated, 80 KB copied, 151 MB peak memory
512: OK (1.12s)
20.2 ms ± 1.3 ms, 49 MB allocated, 120 KB copied, 151 MB peak memory
1024: OK (0.55s)
41.1 ms ± 3.4 ms, 99 MB allocated, 199 KB copied, 151 MB peak memory
2048: OK (1.09s)
80.3 ms ± 5.1 ms, 197 MB allocated, 356 KB copied, 151 MB peak memory
4096: OK (0.49s)
159 ms ± 15 ms, 393 MB allocated, 671 KB copied, 151 MB peak memory
8192: OK (0.96s)
319 ms ± 14 ms, 788 MB allocated, 1.3 MB copied, 151 MB peak memory
16384: OK (0.84s)
642 ms ± 43 ms, 1.5 GB allocated, 2.5 MB copied, 151 MB peak memory
hashmem
2: OK (0.85s)
218 μs ± 19 μs, 505 KB allocated, 5.0 KB copied, 151 MB peak memory
4: OK (2.75s)
352 μs ± 31 μs, 793 KB allocated, 6.9 KB copied, 151 MB peak memory
8: OK (1.23s)
611 μs ± 58 μs, 1.3 MB allocated, 13 KB copied, 151 MB peak memory
16: OK (1.16s)
1.15 ms ± 93 μs, 2.5 MB allocated, 24 KB copied, 151 MB peak memory
32: OK (1.12s)
2.21 ms ± 157 μs, 4.7 MB allocated, 50 KB copied, 151 MB peak memory
64: OK (2.12s)
4.24 ms ± 416 μs, 9.3 MB allocated, 126 KB copied, 151 MB peak memory
128: OK (1.03s)
8.16 ms ± 490 μs, 18 MB allocated, 152 KB copied, 151 MB peak memory
256: OK (2.12s)
17.0 ms ± 772 μs, 37 MB allocated, 272 KB copied, 151 MB peak memory
512: OK (1.03s)
33.0 ms ± 1.8 ms, 73 MB allocated, 561 KB copied, 151 MB peak memory
1024: OK (2.05s)
66.0 ms ± 5.2 ms, 146 MB allocated, 1.2 MB copied, 151 MB peak memory
2048: OK (4.27s)
138 ms ± 4.6 ms, 292 MB allocated, 3.6 MB copied, 151 MB peak memory
4096: OK (0.90s)
269 ms ± 22 ms, 584 MB allocated, 6.1 MB copied, 151 MB peak memory
8192: OK (1.94s)
564 ms ± 21 ms, 1.1 GB allocated, 16 MB copied, 151 MB peak memory
16384: OK (3.80s)
1.109 s ± 24 ms, 2.3 GB allocated, 38 MB copied, 151 MB peak memory
balanceTransfer
2: OK (0.88s)
109 μs ± 8.3 μs, 222 KB allocated, 1.3 KB copied, 151 MB peak memory
4: OK (1.25s)
157 μs ± 9.8 μs, 317 KB allocated, 1.9 KB copied, 151 MB peak memory
8: OK (2.09s)
257 μs ± 8.8 μs, 504 KB allocated, 4.0 KB copied, 151 MB peak memory
16: OK (0.90s)
444 μs ± 30 μs, 880 KB allocated, 9.4 KB copied, 151 MB peak memory
32: OK (1.65s)
817 μs ± 29 μs, 1.6 MB allocated, 27 KB copied, 151 MB peak memory
64: OK (1.69s)
1.67 ms ± 125 μs, 3.1 MB allocated, 88 KB copied, 151 MB peak memory
128: OK (1.72s)
3.36 ms ± 188 μs, 6.0 MB allocated, 339 KB copied, 151 MB peak memory
256: OK (0.90s)
7.04 ms ± 573 μs, 12 MB allocated, 1.3 MB copied, 151 MB peak memory
512: OK (0.92s)
14.4 ms ± 1.0 ms, 24 MB allocated, 3.4 MB copied, 151 MB peak memory
1024: OK (0.92s)
29.0 ms ± 2.6 ms, 47 MB allocated, 7.3 MB copied, 151 MB peak memory
2048: OK (0.94s)
60.5 ms ± 5.0 ms, 94 MB allocated, 16 MB copied, 151 MB peak memory
4096: OK (0.93s)
121 ms ± 8.2 ms, 189 MB allocated, 32 MB copied, 151 MB peak memory
8192: OK (1.83s)
244 ms ± 8.9 ms, 377 MB allocated, 67 MB copied, 202 MB peak memory
16384: OK (1.78s)
493 ms ± 15 ms, 754 MB allocated, 135 MB copied, 215 MB peak memory
funcCall
2: OK (5.18s)
174 μs ± 2.5 μs, 375 KB allocated, 3.4 KB copied, 223 MB peak memory
4: OK (1.82s)
241 μs ± 18 μs, 516 KB allocated, 5.0 KB copied, 223 MB peak memory
8: OK (1.52s)
388 μs ± 20 μs, 798 KB allocated, 8.5 KB copied, 223 MB peak memory
16: OK (0.66s)
669 μs ± 55 μs, 1.3 MB allocated, 16 KB copied, 223 MB peak memory
32: OK (0.63s)
1.26 ms ± 123 μs, 2.4 MB allocated, 29 KB copied, 223 MB peak memory
64: OK (0.64s)
2.49 ms ± 242 μs, 4.6 MB allocated, 56 KB copied, 223 MB peak memory
128: OK (1.13s)
4.61 ms ± 424 μs, 9.0 MB allocated, 98 KB copied, 223 MB peak memory
256: OK (1.10s)
9.11 ms ± 826 μs, 18 MB allocated, 114 KB copied, 223 MB peak memory
512: OK (1.05s)
17.9 ms ± 1.0 ms, 36 MB allocated, 146 KB copied, 223 MB peak memory
1024: OK (1.06s)
36.0 ms ± 2.1 ms, 71 MB allocated, 210 KB copied, 223 MB peak memory
2048: OK (0.50s)
71.4 ms ± 6.7 ms, 142 MB allocated, 338 KB copied, 223 MB peak memory
4096: OK (0.98s)
142 ms ± 8.2 ms, 283 MB allocated, 589 KB copied, 223 MB peak memory
8192: OK (0.92s)
285 ms ± 22 ms, 567 MB allocated, 1.1 MB copied, 223 MB peak memory
16384: OK (0.79s)
568 ms ± 29 ms, 1.1 GB allocated, 2.1 MB copied, 223 MB peak memory
contractCreation
2: OK (2.02s)
252 μs ± 16 μs, 547 KB allocated, 6.0 KB copied, 223 MB peak memory
4: OK (0.90s)
432 μs ± 41 μs, 862 KB allocated, 12 KB copied, 223 MB peak memory
8: OK (3.05s)
728 μs ± 16 μs, 1.5 MB allocated, 29 KB copied, 223 MB peak memory
16: OK (1.52s)
1.40 ms ± 77 μs, 2.7 MB allocated, 78 KB copied, 223 MB peak memory
32: OK (0.82s)
2.84 ms ± 255 μs, 5.1 MB allocated, 265 KB copied, 223 MB peak memory
64: OK (0.86s)
6.25 ms ± 484 μs, 10 MB allocated, 1.3 MB copied, 223 MB peak memory
128: OK (0.89s)
13.5 ms ± 952 μs, 20 MB allocated, 3.8 MB copied, 223 MB peak memory
256: OK (0.90s)
28.0 ms ± 2.5 ms, 40 MB allocated, 8.6 MB copied, 223 MB peak memory
512: OK (0.92s)
62.0 ms ± 6.0 ms, 81 MB allocated, 19 MB copied, 223 MB peak memory
1024: OK (1.93s)
135 ms ± 6.6 ms, 161 MB allocated, 38 MB copied, 223 MB peak memory
2048: OK (1.89s)
278 ms ± 16 ms, 322 MB allocated, 77 MB copied, 223 MB peak memory
4096: OK (3.86s)
602 ms ± 59 ms, 642 MB allocated, 152 MB copied, 371 MB peak memory
8192: OK (1.54s)
1.191 s ± 41 ms, 1.3 GB allocated, 299 MB copied, 371 MB peak memory
16384: OK (7.63s)
2.725 s ± 32 ms, 2.5 GB allocated, 664 MB copied, 1.1 GB peak memory
contractCreationMem
2: OK (1.09s)
1.05 ms ± 81 μs, 2.3 MB allocated, 97 KB copied, 1.1 GB peak memory
4: OK (1.00s)
1.89 ms ± 137 μs, 3.9 MB allocated, 250 KB copied, 1.1 GB peak memory
8: OK (2.12s)
3.96 ms ± 298 μs, 7.3 MB allocated, 928 KB copied, 1.1 GB peak memory
16: OK (1.14s)
8.75 ms ± 444 μs, 14 MB allocated, 3.0 MB copied, 1.1 GB peak memory
32: OK (1.21s)
18.3 ms ± 1.2 ms, 27 MB allocated, 7.0 MB copied, 1.1 GB peak memory
64: OK (0.60s)
37.5 ms ± 3.6 ms, 54 MB allocated, 15 MB copied, 1.1 GB peak memory
128: OK (1.21s)
77.5 ms ± 4.4 ms, 108 MB allocated, 33 MB copied, 1.1 GB peak memory
256: OK (1.15s)
157 ms ± 12 ms, 215 MB allocated, 67 MB copied, 1.1 GB peak memory
512: OK (2.39s)
321 ms ± 7.1 ms, 433 MB allocated, 136 MB copied, 1.1 GB peak memory
1024: OK (4.80s)
658 ms ± 27 ms, 867 MB allocated, 283 MB copied, 1.1 GB peak memory
2048: OK (1.90s)
1.289 s ± 60 ms, 1.7 GB allocated, 548 MB copied, 1.1 GB peak memory
4096: OK (19.38s)
2.644 s ± 60 ms, 3.4 GB allocated, 1.1 GB copied, 1.4 GB peak memory
8192: OK (18.23s)
5.485 s ± 541 ms, 6.8 GB allocated, 2.3 GB copied, 2.6 GB peak memory
16384: OK (36.59s)
10.845 s ± 169 ms, 14 GB allocated, 4.5 GB copied, 4.4 GB peak memory
arrayCreationMem
2: OK (1.07s)
537 μs ± 28 μs, 1.4 MB allocated, 22 KB copied, 4.4 GB peak memory
4: OK (1.43s)
1.52 ms ± 123 μs, 3.9 MB allocated, 67 KB copied, 4.4 GB peak memory
8: OK (1.21s)
5.29 ms ± 465 μs, 14 MB allocated, 247 KB copied, 4.4 GB peak memory
16: OK (1.08s)
19.6 ms ± 908 μs, 54 MB allocated, 377 KB copied, 4.4 GB peak memory
32: OK (1.01s)
76.1 ms ± 3.4 ms, 211 MB allocated, 973 KB copied, 4.4 GB peak memory
64: OK (0.38s)
296 ms ± 27 ms, 839 MB allocated, 2.8 MB copied, 4.4 GB peak memory
128: OK (1.52s)
1.188 s ± 38 ms, 3.3 GB allocated, 8.2 MB copied, 4.4 GB peak memory
256: OK (6.07s)
4.735 s ± 43 ms, 13 GB allocated, 23 MB copied, 4.4 GB peak memory
512: OK (24.08s)
18.815 s ± 52 ms, 52 GB allocated, 73 MB copied, 4.4 GB peak memory
mapStorage
2: OK (0.95s)
238 μs ± 20 μs, 530 KB allocated, 2.9 KB copied, 4.4 GB peak memory
4: OK (0.83s)
408 μs ± 30 μs, 898 KB allocated, 5.7 KB copied, 4.4 GB peak memory
8: OK (1.54s)
753 μs ± 36 μs, 1.6 MB allocated, 12 KB copied, 4.4 GB peak memory
16: OK (0.74s)
1.43 ms ± 105 μs, 3.0 MB allocated, 24 KB copied, 4.4 GB peak memory
32: OK (0.73s)
2.81 ms ± 243 μs, 5.9 MB allocated, 58 KB copied, 4.4 GB peak memory
64: OK (0.71s)
5.51 ms ± 420 μs, 12 MB allocated, 131 KB copied, 4.4 GB peak memory
128: OK (0.72s)
11.2 ms ± 930 μs, 23 MB allocated, 244 KB copied, 4.4 GB peak memory
256: OK (0.72s)
22.4 ms ± 2.0 ms, 47 MB allocated, 498 KB copied, 4.4 GB peak memory
512: OK (1.43s)
44.8 ms ± 1.8 ms, 94 MB allocated, 1.1 MB copied, 4.4 GB peak memory
1024: OK (0.70s)
91.7 ms ± 7.4 ms, 187 MB allocated, 2.3 MB copied, 4.4 GB peak memory
2048: OK (0.65s)
184 ms ± 18 ms, 374 MB allocated, 5.2 MB copied, 4.4 GB peak memory
4096: OK (1.29s)
366 ms ± 30 ms, 751 MB allocated, 11 MB copied, 4.4 GB peak memory
8192: OK (1.10s)
723 ms ± 71 ms, 1.5 GB allocated, 26 MB copied, 4.4 GB peak memory
16384: OK (2.25s)
1.477 s ± 129 ms, 2.9 GB allocated, 56 MB copied, 4.4 GB peak memory
All 135 tests passed (289.42s) Benchmark results from this PR
|
My opinion is to not merge unless we can demonstrate benefit. |
Description
This PR replaces the current
ConcreteStorage
Map
with aHashMap
that provides better performance. Additionally, it adds a fast case tosimplifyNoLitToKeccak
forLit
s andConcreteStorage
which don't need simplification, and was causing a performance regression versus hevm 0.54.2. Finally, it adds a simple benchmark case to exercise SSTORE, used to show the improvement.Checklist