Skip to content

Switch to elm-bench#102

Open
gampleman wants to merge 3 commits into
masterfrom
switch-to-elm-bench
Open

Switch to elm-bench#102
gampleman wants to merge 3 commits into
masterfrom
switch-to-elm-bench

Conversation

@gampleman
Copy link
Copy Markdown
Collaborator

This PR switches our benchmarking implementation to my new elm-bench tool.

The automatic verification feature was helpful, as we found several benchmarks that were incorrect (and these are fixed below).

I also re-ran the whole suite (elm-bench run -t node -t chrome -t firefox -t safari - this takes a long time) in a bunch of runtimes and have the results here:

core-extra / application / curry

Implementation Node Chrome Firefox Safari
lambda, fully applied 1,818,165 1,917,006 1,778,669 ⬇ 2,490,493
lambda, piping 1,795,228 1,909,650 1,764,783 ⬇ 2,459,942
name only 1,321,271 1,368,063 1,893,619 2,199,281
lambda nested, fully applied 926,418 1,145,732 913,360 1,031,655
partially curried/applied 722,075 880,553 721,435 842,381

core-extra / application / chain

Implementation Node Chrome Firefox Safari
declaration argument 960,795 2,427,667 1,545,137 ⬇ 3,900,334
lambda 955,513 2,389,004 1,578,890 2,421,043
lambda >> 953,193 2,328,343 1,071,932 1,019,071
>> 545,441 914,366 778,393 974,454

core-extra / Array / Array.fold

Implementation Node Chrome Firefox Safari
foldl 1,319,692 1,359,366 1,853,010 ⬇ 2,223,476 ⬇
foldr 1,292,286 1,349,516 2,027,702 4,321,056

core-extra / Array.Extra / mapToList

Implementation Node Chrome Firefox Safari
with foldr 935,258 1,038,187 1,246,844 1,287,166
with Array.toIndexedList 534,396 565,137 464,022 715,671

core-extra / Array.Extra / indexedMapToList

Implementation Node Chrome Firefox Safari
with Array.foldr 622,992 721,774 ⬇ 828,472 804,918 ⬇
with Array.indexedMap 492,263 810,908 790,135 852,977
with List.indexedMap 438,606 441,074 323,608 440,282
with toIndexedList 331,320 370,662 320,819 424,804

core-extra / Array.Extra / reverse

Implementation Node Chrome Firefox Safari
with cons 657,138 1,250,675 669,340 1,233,561
with List.reverse 586,679 1,013,886 428,185 756,452
with push 67,094 569,612 154,963 330,228

core-extra / Array.Extra / unzip

Implementation Node Chrome Firefox Safari
with maps 464,208 1,098,931 828,358 1,211,580
with cons 286,948 510,443 357,272 523,307
with List.unzip 243,389 393,619 258,587 383,634
with push 33,028 255,838 75,684 156,341

core-extra / Array.Extra / map2

Implementation Node Chrome Firefox Safari
with List.map2 315,360 451,612 327,117 434,445
with un-cons 283,871 398,479 267,583 376,806
with get 141,042 167,132 123,580 218,804

core-extra / Array.Extra / filterMap

Implementation Node Chrome Firefox Safari
with cons 388,269 610,420 677,659 686,092
with List.filterMap 352,330 531,070 389,291 449,828
with push 87,984 437,296 178,251 352,665

core-extra / Array.Extra / all

Implementation Node Chrome Firefox Safari
with fold 1,738,019 1,902,188 1,628,380 2,394,809
recursive get 941,741 877,561 ⬇ 400,199 ⬇ 684,865 ⬇
with List.all 773,935 888,634 859,677 799,757
recursive last 141,932 155,825 106,237 249,411

core-extra / Array.Extra / any

Implementation Node Chrome Firefox Safari
with fold 1,754,136 1,847,955 1,644,983 2,516,648
with List.any 1,007,152 1,017,429 788,823 1,295,487
recursive get 947,574 896,277 395,705 676,736
recursive last 140,189 156,802 106,523 249,663

core-extra / Array.Extra / intersperse

Implementation Node Chrome Firefox Safari
with List.intersperse 279,636 425,795 288,913 436,933
with cons 248,084 408,117 199,905 316,785
with push 32,328 242,490 71,389 150,164

core-extra / Array.Extra / member

Implementation Node Chrome Firefox Safari
with fold 1,451,770 1,517,437 1,033,552 1,917,128
with any 1,391,020 1,472,653 945,379 1,796,929
with List.member 1,278,542 1,394,698 911,273 1,271,475
recursive 703,256 690,882 588,166 678,752

core-extra / List.Extra / uniquePairs

Implementation Node Chrome Firefox Safari
original (++) 11,853 13,402 8,052 ⬇ 14,707
tail-recursive 10,757 12,109 9,563 14,239

core-extra / List.Extra / unfoldr

Implementation Node Chrome Firefox Safari
tail-recursive 1,715,521 2,033,190 ⬇ 689,446 ⬇ 747,862 ⬇
original 1,371,755 2,580,019 902,933 762,312

core-extra / List.Extra / lift2

Implementation Node Chrome Firefox Safari
foldl 548,806 617,389 457,778 653,488
original 220,242 263,621 177,020 308,148

core-extra / List.Extra / lift3

Implementation Node Chrome Firefox Safari
foldl 55,737 65,178 39,950 64,883
original 19,432 22,854 14,273 26,187

core-extra / List.Extra / lift4

Implementation Node Chrome Firefox Safari
foldl 5,249 6,318 3,876 5,967
original 1,677 1,988 1,242 2,108

core-extra / List.Extra / notMember 1

Implementation Node Chrome Firefox Safari
Simplified 55,412,183 63,029,739 35,835,268 34,268,312
Original 22,681,356 30,324,713 24,040,956 23,539,880

core-extra / List.Extra / notMember 99

Implementation Node Chrome Firefox Safari
Simplified 3,132,275 3,058,952 1,079,472 2,019,426
Original 2,881,956 2,987,832 1,000,254 1,979,739

core-extra / List.Extra / notMember 101

Implementation Node Chrome Firefox Safari
Simplified 3,091,747 3,007,712 1,022,391 1,982,765 ⬇
Original 2,855,445 2,889,789 997,597 2,017,150

core-extra / List.Extra / dropRight 5 10

Implementation Node Chrome Firefox Safari
reverse 21,544,828 28,005,570 6,918,447 ⬇ 10,734,141 ⬇
length 12,043,011 13,392,798 6,598,540 ⬇ 13,024,499
foldr 8,820,479 10,480,274 7,499,375 10,059,641

core-extra / List.Extra / takeRight 5 10

Implementation Node Chrome Firefox Safari
reverse 16,257,379 23,649,014 5,456,217 ⬇ 8,342,160 ⬇
length 13,374,892 15,304,357 10,487,861 17,084,160
foldr 8,688,174 10,508,187 7,475,200 9,734,281

core-extra / List.Extra / dropRight 50 100

Implementation Node Chrome Firefox Safari
reverse 2,817,349 3,098,042 672,455 ⬇ 1,218,135 ⬇
length 1,583,499 1,539,490 876,694 1,608,207
foldr 1,137,793 1,205,608 828,187 1,215,413

core-extra / List.Extra / takeRight 50 100

Implementation Node Chrome Firefox Safari
reverse 2,237,914 2,547,543 583,803 ⬇ 945,014 ⬇
length 1,751,852 1,688,018 1,123,707 2,441,202
foldr 1,130,024 1,198,418 831,177 1,149,116

core-extra / List.Extra / dropRight 500 1000

Implementation Node Chrome Firefox Safari
length 145,711 153,369 ⬇ 92,683 150,974
reverse 136,356 305,104 69,991 ⬇ 121,554
foldr 86,112 109,711 84,353 87,379

core-extra / List.Extra / takeRight 500 1000

Implementation Node Chrome Firefox Safari
length 183,849 185,253 ⬇ 113,679 257,215
reverse 112,533 222,250 58,891 ⬇ 87,685
foldr 86,191 109,239 83,106 83,499

core-extra / List.Extra / insertAt negative index

Implementation Node Chrome Firefox Safari
recursion3 71,553,960 70,992,356 ⬇ 61,364,335 ⬇ 84,206,079 ⬇
takeDrop 71,439,480 71,257,059 61,863,670 82,173,029 ⬇
recursion2 71,294,710 70,725,087 ⬇ 58,713,308 ⬇ 86,273,579
splitAt 70,311,545 71,388,286 61,411,163 83,849,231
recursion 68,720,459 68,774,322 50,128,217 83,711,428

core-extra / List.Extra / insertAt good positive index

Implementation Node Chrome Firefox Safari
recursion3 4,696,347 5,734,770 1,300,690 1,966,174 ⬇
recursion2 3,208,650 3,576,977 967,805 ⬇ 1,681,023 ⬇
splitAt 3,187,435 3,555,862 1,107,970 2,033,747
recursion 1,552,060 1,768,755 743,301 1,241,642
takeDrop 1,190,568 1,263,458 658,531 1,193,921

core-extra / List.Extra / insertAt bad positive index

Implementation Node Chrome Firefox Safari
recursion3 4,523,765 5,320,661 1,544,227 2,215,152 ⬇
recursion2 2,431,041 2,570,170 882,598 ⬇ 1,471,763 ⬇
takeDrop 1,929,756 1,899,123 1,272,992 2,758,243
recursion 1,181,426 1,252,501 887,638 1,460,024
splitAt 1,100,109 1,088,372 499,514 953,823

core-extra / List.Extra / groupsOfWithStep 3 2 [1..10]

Implementation Node Chrome Firefox Safari
using elm-core's List.tail 3,561,614 4,361,879 2,444,056 3,830,573
using fully tail-recursive List.tail 3,533,123 4,322,697 1,993,951 2,836,144

core-extra / List.Extra / greedyGroupsOfWithStep 3 2 [1..10]

Implementation Node Chrome Firefox Safari
using elm-core's List.tail 5,586,377 7,404,826 5,027,326 6,545,338
using fully tail-recursive List.tail 5,549,822 6,913,698 3,205,660 4,076,414

core-extra / List.Extra / groupsOfWithStep 3 2 [1..100]

Implementation Node Chrome Firefox Safari
using elm-core's List.tail 363,427 456,779 251,906 404,096
using fully tail-recursive List.tail 361,719 450,931 202,834 288,673

core-extra / List.Extra / greedyGroupsOfWithStep 3 2 [1..100]

Implementation Node Chrome Firefox Safari
using fully tail-recursive List.tail 644,881 818,412 ⬇ 357,107 ⬇ 418,091 ⬇
using elm-core's List.tail 634,981 915,404 571,774 738,917

core-extra / List.Extra / groupsOfWithStep 3 2 [1..1000]

Implementation Node Chrome Firefox Safari
using elm-core's List.tail 33,763 43,724 24,103 38,639
using fully tail-recursive List.tail 33,298 43,539 19,763 27,922

core-extra / List.Extra / greedyGroupsOfWithStep 3 2 [1..1000]

Implementation Node Chrome Firefox Safari
using fully tail-recursive List.tail 60,452 81,340 ⬇ 33,985 ⬇ 40,535 ⬇
using elm-core's List.tail 59,291 90,569 54,420 74,799

core-extra / List.Extra / groupsOfWithStep 3 2 [1..10000]

Implementation Node Chrome Firefox Safari
using elm-core's List.tail 3,316 4,200 2,300 3,734
using fully tail-recursive List.tail 2,994 4,150 1,829 2,672

core-extra / List.Extra / greedyGroupsOfWithStep 3 2 [1..10000]

Implementation Node Chrome Firefox Safari
using elm-core's List.tail 5,095 9,145 4,951 7,224
using fully tail-recursive List.tail 4,847 8,126 3,070 3,922

core-extra / Tuple.Extra / construction

Implementation Node Chrome Firefox Safari
literal 375,103,121 369,261,728 229,058,880 144,857,722
function 366,607,399 370,426,697 178,612,555 114,654,811

core-extra / Set.Extra / areDisjoint == True

Implementation Node Chrome Firefox Safari
listRecursion 39,691 30,687 ⬇ 15,326 ⬇ 31,657
foldl 35,956 31,112 18,136 29,434 ⬇
intersection 35,832 29,689 ⬇ 20,734 31,374
foldr 35,033 30,788 17,932 29,712

core-extra / Set.Extra / areDisjoint == False (and small)

Implementation Node Chrome Firefox Safari
listRecursion 68,503 56,997 30,042 ⬇ 61,280
foldl 63,760 55,446 34,288 55,443
foldr 60,093 53,288 32,006 54,687
intersection 34,978 29,136 20,710 31,152

core-extra / Set.Extra / areDisjoint == False (and large)

Implementation Node Chrome Firefox Safari
foldl 186,619 213,123 ⬇ 167,457 ⬇ 248,097 ⬇
foldr 180,981 213,627 165,147 ⬇ 256,161
listRecursion 174,518 217,283 179,403 248,600
intersection 16,042 17,359 10,506 16,564

core-extra / Set.Extra / symmetricDifference

Implementation Node Chrome Firefox Safari
orderExploiting 12,012 15,402 8,689 13,625
naive 4,879 5,976 3,437 5,680

core-extra / String.Extra / isBlank / empty string

Implementation Node Chrome Firefox Safari
trim based 73,247,096 81,953,279 81,330,845 65,370,518
regex based (with top-level regex) 27,515,140 27,640,119 30,042,582 24,990,391
regex based 5,548,869 16,857,391 10,578,123 15,956,839

core-extra / String.Extra / isBlank / whitespace string

Implementation Node Chrome Firefox Safari
trim based 53,115,521 65,951,762 66,206,319 49,726,776
regex based (with top-level regex) 22,739,086 26,623,870 23,187,304 23,355,841
regex based 5,228,820 16,035,032 9,259,854 15,068,148

core-extra / String.Extra / isBlank / full string

Implementation Node Chrome Firefox Safari
trim based 65,268,262 73,537,223 73,500,529 61,442,376
regex based (with top-level regex) 41,887,914 46,326,310 35,282,661 50,887,029
regex based 5,808,166 21,208,617 11,023,583 23,342,216

core-extra / String.Extra / String.Extra.{rightOf,leftOf} / 1 match / rightOf

Implementation Node Chrome Firefox Safari
String.indexes 62,129,339 55,450,931 33,304,792 53,791,467
regex 3,534,176 8,288,227 5,537,267 5,471,096

core-extra / String.Extra / String.Extra.{rightOf,leftOf} / 1 match / leftOf

Implementation Node Chrome Firefox Safari
String.indexes 63,376,767 55,415,059 35,529,238 54,700,072
regex 3,616,278 8,226,748 5,606,823 5,427,817

core-extra / String.Extra / String.Extra.{rightOf,leftOf} / 10 matches / rightOf

Implementation Node Chrome Firefox Safari
String.indexes 7,950,902 8,428,476 5,989,067 8,350,736
regex 1,843,658 4,797,713 3,762,835 3,324,972

core-extra / String.Extra / String.Extra.{rightOf,leftOf} / 10 matches / leftOf

Implementation Node Chrome Firefox Safari
String.indexes 7,815,892 8,298,805 5,990,537 8,961,338
regex 2,131,154 5,479,884 4,004,045 4,225,318

core-extra / String.Extra / String.Extra.{rightOf,leftOf} / 100 matches / rightOf

Implementation Node Chrome Firefox Safari
String.indexes 894,857 911,271 ⬇ 636,643 ⬇ 848,038 ⬇
regex 886,551 1,869,720 1,636,184 1,189,286

core-extra / String.Extra / String.Extra.{rightOf,leftOf} / 100 matches / leftOf

Implementation Node Chrome Firefox Safari
regex 2,130,421 5,466,042 4,000,970 4,084,217
String.indexes 900,806 907,562 627,618 863,552

core-extra / String.Extra / String.Extra.{rightOf,leftOf} / 1000 matches / rightOf

Implementation Node Chrome Firefox Safari
regex 156,642 224,049 218,317 109,462
String.indexes 79,641 83,667 65,006 90,639

core-extra / String.Extra / String.Extra.{rightOf,leftOf} / 1000 matches / leftOf

Implementation Node Chrome Firefox Safari
regex 2,119,799 5,455,499 3,989,845 4,033,106
String.indexes 80,360 82,413 65,220 91,909

core-extra / Maybe.Extra / andMap - Just × Just

Implementation Node Chrome Firefox Safari
simplified 61,600,829 52,871,628 50,719,613 61,811,015 ⬇
nested case-of ignoring Nothing 61,519,087 50,068,845 51,765,790 62,208,301
nested case-of 61,109,855 42,589,727 52,029,493 62,073,168
inlined 57,752,026 43,890,323 51,722,940 62,167,559
original 35,500,233 43,598,647 59,906,736 57,176,777

core-extra / Maybe.Extra / andMap - Nothing × Just

Implementation Node Chrome Firefox Safari
simplified 71,608,582 59,835,285 59,592,701 80,962,392 ⬇
inlined 71,421,260 60,171,735 60,605,538 81,811,180
nested case-of ignoring Nothing 71,034,344 60,588,565 59,326,979 76,738,741
nested case-of 70,763,044 59,738,484 60,756,097 75,252,762
original 45,998,586 56,238,099 81,570,910 66,011,256

core-extra / Maybe.Extra / andMap - Just × Nothing

Implementation Node Chrome Firefox Safari
nested case-of ignoring Nothing 74,801,461 60,035,301 65,039,731 83,744,853 ⬇
nested case-of 74,455,676 58,613,187 66,213,180 83,447,194 ⬇
simplified 74,102,492 59,671,407 63,859,743 83,521,035
inlined 72,682,370 59,596,283 59,970,061 82,585,936 ⬇
original 45,882,415 57,818,260 87,707,849 84,007,309

core-extra / Maybe.Extra / andMap - Nothing × Nothing

Implementation Node Chrome Firefox Safari
nested case-of 75,062,034 83,755,740 76,340,930 92,540,690 ⬇
nested case-of ignoring Nothing 75,044,619 83,201,786 74,409,181 90,172,899 ⬇
simplified 74,939,827 82,605,024 71,433,033 93,507,766
inlined 70,907,187 77,318,914 72,169,965 88,377,476
original 49,096,836 59,804,424 103,056,493 88,162,214

core-extra / Result.Extra / andMap - Ok × Ok

Implementation Node Chrome Firefox Safari
inlined 62,571,689 48,011,670 55,995,284 63,021,495 ⬇
original 62,391,582 41,660,377 ⬇ 50,461,060 ⬇ 56,813,210 ⬇
inlined, nested case-of 62,058,667 41,887,272 58,006,069 63,859,101

core-extra / Result.Extra / andMap - Err × Ok

Implementation Node Chrome Firefox Safari
original 68,217,022 54,863,489 ⬇ 60,644,452 65,737,283 ⬇
inlined 66,857,906 55,089,086 58,943,865 68,692,604
inlined, nested case-of 66,492,947 54,497,141 57,951,047 68,353,190

core-extra / Result.Extra / andMap - Ok × Err

Implementation Node Chrome Firefox Safari
inlined, nested case-of 66,030,575 55,450,174 55,847,300 ⬇ 68,783,316 ⬇
inlined 61,455,854 54,994,588 55,830,556 69,209,490
original 61,053,379 54,957,881 49,160,243 60,031,554

core-extra / Result.Extra / andMap - Err × Err

Implementation Node Chrome Firefox Safari
original 67,455,674 55,250,038 59,672,970 63,337,938 ⬇
inlined 65,968,661 55,332,970 57,927,309 ⬇ 65,809,146 ⬇
inlined, nested case-of 61,088,968 54,761,562 58,660,846 67,648,894

core-extra / Result.Extra / andMap - Err × Err (2)

Implementation Node Chrome Firefox Safari
original 67,879,971 55,255,481 60,157,145 62,617,351 ⬇
inlined 66,275,044 55,011,866 57,032,056 67,770,209

core-extra / Result.Extra / foldlWhileOk - Err at the first element

Implementation Node Chrome Firefox Safari
foldlWhileOk 58,647,218 65,834,200 51,695,340 63,505,998
Using List.foldl 754,152 892,720 827,536 896,609

core-extra / Result.Extra / foldlWhileOk - all Ok

Implementation Node Chrome Firefox Safari
foldlWhileOk 1,627,342 1,758,855 1,150,589 2,141,133
Using List.foldl 497,733 668,113 591,813 817,632

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants