I was a little surprised at the performance difference here:
julia> shuffle!(a)
9-element Array{Tuple{Int64,Int64},1}:
(1, 2)
(2, 20)
(2, 30)
(2, 10)
(3, 39)
(1, 6)
(1, 4)
(3, 31)
(3, 33)
julia> s = [i[1] for i in a]; d = [i[2] for i in a];
julia> b = hcat(s, d)
9×2 Array{Int64,2}:
1 2
2 20
2 30
2 10
3 39
1 6
1 4
3 31
3 33
julia> @benchmark(sort($a))
BenchmarkTools.Trial:
memory estimate: 384 bytes
allocs estimate: 3
--------------
minimum time: 231.093 ns (0.00% GC)
median time: 445.286 ns (0.00% GC)
mean time: 483.968 ns (3.47% GC)
maximum time: 18.558 μs (0.00% GC)
--------------
samples: 10000
evals/sample: 290
julia> @benchmark(sortrows($b))
BenchmarkTools.Trial:
memory estimate: 1.22 KiB
allocs estimate: 18
--------------
minimum time: 1.104 μs (0.00% GC)
median time: 2.005 μs (0.00% GC)
mean time: 2.303 μs (4.32% GC)
maximum time: 226.557 μs (93.68% GC)
--------------
samples: 10000
evals/sample: 10