Skip to content

Commit 88a6a93

Browse files
authored
Performance improvements (krynju#17)
1 parent bf246f2 commit 88a6a93

File tree

6 files changed

+241
-356
lines changed

6 files changed

+241
-356
lines changed

README.md

+10-7
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@ An overview of performance is shown below. Times are shown for an average of 100
1616

1717
### Table
1818

19-
| N | insert [us] | delete [us] | lookup [us] |
20-
| :------------- | :------------- | :-------| :---- |
21-
| 10<sup>3</sup> | 86.039 | 67.768 | 67.433 |
22-
|10<sup>4</sup> | 152.533 | 87.305 | 89.556 |
23-
| 10<sup>5</sup> | 260.794 | 107.378 | 114.014 |
24-
| 10<sup>6</sup> | 424.0 | 123.648 | 124.587 |
25-
| 10<sup>7</sup> | 659.088 | 135.373 | 134.609 |
19+
```julia
20+
Row │ n insert[us] delete[us] search[us]
21+
│ Any Float64? Float64? Float64?
22+
─────┼────────────────────────────────────────────────
23+
11000 152.67 32.02 0.00222892
24+
210000 174.1 63.86 0.00227912
25+
3100000 299.6 165.86 0.00235597
26+
41000000 629.11 524.92 0.00304124
27+
510000000 964.76 912.39 0.025
28+
```
2629

2730
### Plot
2831

benchmark/benchmark.jl

+9-8
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ search_vec = []
2828

2929

3030
d = DataFrame((op=[], time=[], n=[]))
31-
x = [1_000, 10_000, 100_000]
31+
x = [1_000, 10_000, 100_000, 1_000_000, 10_000_000]
3232

3333
function prepare_t(t)
3434
_t = deepcopy(t)
@@ -49,9 +49,9 @@ for attempt in 1:1
4949
insert!(t, i, i)
5050
end
5151

52-
insertion = @benchmark batch_insert!(_t, nums_test) setup=(_t =deepcopy(t)) samples=1 evals=1
53-
search = @benchmark batch_find(t, nums_test) setup=(_t = prepare_t(t)) samples=1 evals=1
54-
deletion = @benchmark batch_delete!(t, nums_test) setup=(_t = prepare_t(t)) samples=1 evals=1
52+
insertion = @benchmark batch_insert!(_t, nums_test) setup=(_t =deepcopy(t))
53+
search = @benchmark batch_find(t, nums_test) setup=(_t = prepare_t(t))
54+
deletion = @benchmark batch_delete!(t, nums_test) setup=(_t = prepare_t(t))
5555

5656
push!(d, ("insert", minimum(insertion).time, N))
5757
push!(d, ("delete", minimum(deletion).time,N))
@@ -71,16 +71,17 @@ c = combine(groupby(d, [:op,:n]), :time => minimum)
7171

7272
plot(
7373
x,
74-
[c[(c.op.=="insert"),:].time_minimum./10000,c[(c.op.=="delete"),:].time_minimum./10000, c[(c.op.=="search"),:].time_minimum./10000],
74+
[c[(c.op.=="insert"),:].time_minimum,c[(c.op.=="delete"),:].time_minimum, c[(c.op.=="search"),:].time_minimum],
7575
xscale = :log10,
7676
ylabel = "operation time [us]",
7777
xlabel = "N",
78+
xticks = [1e3, 1e4, 1e5, 1e6, 1e7],
7879
markershape =[:diamond :utriangle :dtriangle],
7980
labels= ["insert" "delete" "lookup"],
8081
legend=:topleft,
8182
)
8283

83-
savefig("result_master.svg")
84-
savefig("result_master.png")
84+
savefig("branch_results_new2.svg")
85+
savefig("result_new2.png")
8586
using CSV
86-
CSV.write("branch_results_master.csv", c)
87+
CSV.write("branch_results_new2.csv", c)

benchmark/result.svg

+86-245
Loading

benchmark/results.csv

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
op,n,time_minimum
2+
insert,1000,1.5267e6
3+
delete,1000,320200.0
4+
search,1000,22.289156626506024
5+
insert,10000,1.741e6
6+
delete,10000,638600.0
7+
search,10000,22.79116465863454
8+
insert,100000,2.996e6
9+
delete,100000,1.6586e6
10+
search,100000,23.559670781893004
11+
insert,1000000,6.2911e6
12+
delete,1000000,5.2492e6
13+
search,1000000,30.412371134020617
14+
insert,10000000,9.6476e6
15+
delete,10000000,9.1239e6
16+
search,10000000,250.0

src/set.jl

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ function AVLSet(x::K) where {K <: AbstractVector}
1616
end
1717

1818
Base.eltype(::Type{AVLSet{K}}) where {K} = K
19-
Base.length(set::AVLSet) = length(set.tree)
20-
Base.in(x::K, set::AVLSet{K}) where {K} = !isnothing(find_node(set.tree, x))
19+
Base.length(set::AVLSet) = length(set.tree)
20+
Base.in(x::K, set::AVLSet{K}) where {K} = x in set.tree
2121

2222
function iterate(set::AVLSet{K}) where {K}
2323
ret = iterate(set.tree)
24-
if isnothing(ret) return nothing else return (ret[1][1], ret[2]) end
24+
if ret === nothing return nothing else return (ret[1][1], ret[2]) end
2525
end
2626

2727
function iterate(set::AVLSet{K}, node::Node{K,Nothing}) where {K}
2828
ret = iterate(set.tree, node)
29-
if isnothing(ret) return nothing else return (ret[1][1], ret[2]) end
29+
if ret === nothing return nothing else return (ret[1][1], ret[2]) end
3030
end
3131

3232
Base.push!(set::AVLSet{K}, item::K) where {K} = insert!(set.tree, item, nothing)

0 commit comments

Comments
 (0)