@@ -3,52 +3,131 @@ module SortBenchmarks
3
3
include (joinpath (dirname (@__FILE__ ), " .." , " utils" , " RandUtils.jl" ))
4
4
5
5
using . RandUtils
6
+ using Random
6
7
using BenchmarkTools
7
8
8
9
const SUITE = BenchmarkGroup ()
9
- const LIST_SIZE = 50000
10
- const LISTS = (
11
- (" ascending" , collect (1 : LIST_SIZE)),
12
- (" descending" , collect (LIST_SIZE: - 1 : 1 )),
13
- (" ones" , ones (LIST_SIZE)),
14
- (" random" , samerand (LIST_SIZE))
15
- )
16
10
17
- # ####################################
18
- # QuickSort/MergeSort/InsertionSort #
19
- # ####################################
11
+ # ###############################################
12
+ # Default algorithms at various sizes (≈162s) #
13
+ # ###############################################
20
14
21
- for (group, Alg) in ((" quicksort" , QuickSort), (" mergesort" , MergeSort), (" insertionsort" , InsertionSort))
22
- g = addgroup! (SUITE, group)
23
- for (kind, list) in LISTS
24
- ix = collect (1 : length (list))
25
- g[" sort forwards" , kind] = @benchmarkable sort ($ list; alg = $ Alg)
26
- g[" sort reverse" , kind] = @benchmarkable sort ($ list; alg = $ Alg, rev = true )
27
- g[" sortperm forwards" , kind] = @benchmarkable sortperm ($ list; alg = $ Alg)
28
- g[" sortperm reverse" , kind] = @benchmarkable sortperm ($ list; alg = $ Alg, rev = true )
29
- g[" sort! forwards" , kind] = @benchmarkable sort! (x; alg = $ Alg) setup= (x = copy ($ list))
30
- g[" sort! reverse" , kind] = @benchmarkable sort! (x; alg = $ Alg, rev = true ) setup= (x = copy ($ list))
31
- g[" sortperm! forwards" , kind] = @benchmarkable sortperm! (x, $ list; alg = $ Alg) setup= (x = copy ($ ix))
32
- g[" sortperm! reverse" , kind] = @benchmarkable sortperm! (x, $ list; alg = $ Alg, rev = true ) setup= (x = copy ($ ix))
15
+ for LENGTH in [3 , 10 , 30 , 100 , 1000 , 10000 ]
16
+ g = addgroup! (SUITE, " length = $LENGTH " )
17
+
18
+ g[" sort!(fill(missing, length), rev=true)" ] = @benchmarkable sort! (x, rev= true ) setup= (x= fill (missing , $ LENGTH))
19
+ g[" sort!(fill(missing, length))" ] = @benchmarkable sort! (x) setup= (x= fill (missing , $ LENGTH))
20
+ g[" sort!(rand(Int, length))" ] = @benchmarkable sort! (rand! (x)) setup= (x= rand (Int, $ LENGTH)) # 47474
21
+ g[" sort(randn(length))" ] = @benchmarkable sort (x) setup= (x= randn ($ LENGTH))
22
+
23
+ g[" sortperm(rand(length))" ] = @benchmarkable sortperm (x) setup= (x= rand ($ LENGTH))
24
+
25
+ g[" mixed eltype with by order" ] = @benchmarkable sort (x; by= x -> x isa Symbol ? (0 , x) : (1 , x)) setup= (x= [rand () < .5 ? randstring () : Symbol (randstring ()) for _ in 1 : $ LENGTH])
26
+
27
+ # 27781
28
+ g[" Float64 unions with missing" ] = @benchmarkable sort (x) setup= (x= shuffle! (vcat (fill (missing , $ (LENGTH÷ 10 )), rand ($ (LENGTH* 9 ÷ 10 )))))
29
+ g[" Int unions with missing" ] = @benchmarkable sort (x) setup= (x= shuffle! (vcat (fill (missing , $ (LENGTH÷ 10 )), rand (Int, $ (LENGTH* 9 ÷ 10 )))))
30
+
31
+ n = ceil (Int, cbrt (LENGTH/ 4 ))
32
+ for i in 1 : 3 # 47538, 45326
33
+ g[" sort(rand(2n, 2n, n); dims=$i )" ] = @benchmarkable sort (rand (2 * $ n,2 * $ n,$ n); dims= $ i)
34
+ g[" sort!(rand(2n, 2n, n); dims=$i )" ] = @benchmarkable sort! (rand (2 * $ n,2 * $ n,$ n); dims= $ i)
33
35
end
36
+
37
+ g[" ascending" ] = @benchmarkable sort! (x) setup= (x= sort (rand ($ LENGTH)))
38
+ g[" descending" ] = @benchmarkable sort (x) setup= (x= sort (rand ($ LENGTH)))
39
+ g[" all same" ] = @benchmarkable sort! (x) setup= (x= fill (rand (), $ LENGTH))
40
+
34
41
for b in values (g)
35
- b. params. time_tolerance = 0.30
42
+ b. params. time_tolerance = 0.20
36
43
end
37
44
end
38
45
39
- # ###########
40
- # issorted #
41
- # ###########
46
+ # #################
47
+ # Issues (≈56s) #
48
+ # #################
49
+
50
+ let g = addgroup! (SUITE, " issues" )
51
+
52
+ # 939
53
+ g[" sortperm(collect(1000000:-1:1))" ] = @benchmarkable sortperm (x) setup= (x= collect (1000000 : - 1 : 1 ))
54
+ g[" sortperm(rand(10^5))" ] = @benchmarkable sortperm (x) setup= (x= rand (10 ^ 5 ))
55
+ g[" sortperm(rand(10^7))" ] = @benchmarkable sortperm (x) setup= (x= rand (10 ^ 7 ))
56
+
57
+ # 9832
58
+ a_9832 = rand (Int, 30_000_000 , 2 )
59
+ g[" sortslices sorting very short slices" ] = @benchmarkable sortslices ($ a_9832, dims= 2 )
60
+
61
+ # 36546
62
+ xv_36546 = view (rand (1000 ), 1 : 1000 )
63
+ g[" sortperm on a view (Float64)" ] = @benchmarkable sortperm ($ xv_36546)
64
+ xs_36546 = rand (1 : 10 ^ 3 , 10 ^ 4 , 2 )
65
+ g[" sortperm on a view (Int)" ] = @benchmarkable sortperm (view ($ xs_36546,:,1 ))
66
+
67
+ # 39864
68
+ v2_39864 = samerand (2000 )
69
+ g[" inplace sorting of a view" ] = @benchmarkable sort! (vv) setup = (vv1 = deepcopy ($ v2_39864); vv = @view vv1[500 : 1499 ]) evals = 1
70
+
71
+ # 46149
72
+ g[" Float16" ] = @benchmarkable sort! (x) setup= (x= rand (Float16, 10 ^ 6 )) evals= 1
73
+
74
+ # 47152
75
+ g[" small Int view" ] = @benchmarkable sort! (view (x,2 : 4 )) setup= (x = [2 ,1 ,10 ,15 ,20 ])
76
+ g[" small Float64 view" ] = @benchmarkable sort! (view (x,2 : 4 )) setup= (x = [2.0 ,1.0 ,10.0 ,15.0 ,20.0 ])
77
+
78
+ # 47191
79
+ g[" partialsort(rand(10_000), 10_000)" ] = @benchmarkable partialsort (x, 10_000 ) setup= (x= rand (10_000 ))
80
+
81
+ # 47715
82
+ g[" sort(rand(10^8))" ] = @benchmarkable sort (x) setup= (x= rand (10 ^ 8 ))
83
+
84
+ # 47766
85
+ g[" partialsort!(rand(10_000), 1:3, rev=true)" ] = @benchmarkable partialsort! (x, 1 : 3 ; rev= true ) setup= (x= rand (10_000 )) evals= 1
86
+ for b in values (g)
87
+ b. params. time_tolerance = 0.20
88
+ end
89
+ end
90
+
91
+ # ############################################
92
+ # QuickSort/MergeSort/InsertionSort (≈47s) #
93
+ # ############################################
94
+
95
+ for (group, Alg, len) in ((" quicksort" , QuickSort, 50_000 ), (" mergesort" , MergeSort, 50_000 ), (" insertionsort" , InsertionSort, 100 ))
96
+ list = samerand (len)
97
+ g = addgroup! (SUITE, group)
98
+
99
+ ix = collect (1 : length (list))
100
+ g[" sort forwards" ] = @benchmarkable sort ($ list; alg = $ Alg)
101
+ g[" sortperm forwards" ] = @benchmarkable sortperm ($ list; alg = $ Alg)
102
+ g[" sort! reverse" ] = @benchmarkable sort! (x; alg = $ Alg, rev = true ) setup= (x = copy ($ list)) evals= 1
103
+ g[" sortperm! reverse" ] = @benchmarkable sortperm! (x, $ list; alg = $ Alg, rev = true ) setup= (x = copy ($ ix))
104
+
105
+ for b in values (g)
106
+ b. params. time_tolerance = 0.20
107
+ end
108
+ end
109
+
110
+ # ###################
111
+ # issorted (≈10s) #
112
+ # ###################
42
113
43
114
g = addgroup! (SUITE, " issorted" )
44
115
116
+ const LIST_SIZE = 50_000
117
+ const LISTS = (
118
+ (" ascending" , collect (1 : LIST_SIZE)),
119
+ (" descending" , collect (LIST_SIZE: - 1 : 1 )),
120
+ (" ones" , ones (LIST_SIZE)),
121
+ (" random" , samerand (LIST_SIZE))
122
+ )
123
+
45
124
for (kind, list) in LISTS
46
125
g[" forwards" , kind] = @benchmarkable issorted ($ list)
47
126
g[" reverse" , kind] = @benchmarkable issorted ($ list; rev = true )
48
127
end
49
128
50
129
for b in values (g)
51
- b. params. time_tolerance = 0.30
130
+ b. params. time_tolerance = 0.20
52
131
end
53
132
54
133
end # module
0 commit comments