Skip to content

Instantly share code, notes, and snippets.

@timholy
Created November 16, 2014 12:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timholy/e6b053f25203df111e57 to your computer and use it in GitHub Desktop.
Save timholy/e6b053f25203df111e57 to your computer and use it in GitHub Desktop.
Benchmarking array views
using ArrayViews
Base.linearindexing(::ContiguousView) = Base.LinearFast()
### 2d ###
## Construction
# col slice
for f in (:view, :sub, :slice)
fname = symbol("buildcols_"*string(f))
@eval begin
function $fname(A::AbstractMatrix, n)
local v
for i = 1:n
for j = 1:size(A,2)
v = $f(A, :, j)
end
end
v
end
end
end
# row slice
for f in (:view, :sub, :slice)
fname = symbol("buildrows_"*string(f))
@eval begin
function $fname(A::AbstractMatrix, n)
local v
for i = 1:n
for j = 1:size(A,1)
v = $f(A, j, :)
end
end
v
end
end
end
# subset
for f in (:view, :sub, :slice)
fname = symbol("buildsubset_"*string(f))
@eval begin
function $fname(A::AbstractMatrix, n)
local v
for i = 1:n
for j = 2:size(A,2)-2
v = $f(A, 2:size(A,1)-1, j:size(A,2)-1)
end
end
v
end
end
end
A = rand(30, 30)
println("Construction")
for f in (:buildcols_view, :buildcols_sub, :buildcols_slice,
:buildrows_view, :buildrows_sub, :buildrows_slice,
:buildsubset_view, :buildsubset_sub, :buildsubset_slice)
@eval begin
$f(A, 1)
print("$($f): ")
gc_disable()
@time $f(A, 10^4)
gc_enable()
gc()
end
end
## Access
function mdsum(A, n)
s = 0.0
for k = 1:n
@inbounds for a in A
s += a
end
end
s
end
function sumlinear(A, n)
s = 0.0
for k = 1:n
@inbounds for i = 1:length(A)
s += A[i]
end
end
s
end
function sumcart(A::AbstractMatrix, n)
s = 0.0
for k = 1:n
@inbounds for j = 1:size(A,2), i = 1:size(A,1)
s += A[i,j]
end
end
s
end
sumcart(A::AbstractVector, n) = sumlinear(A, n)
function sumiter(A, n)
s = 0.0
for k = 1:n
@inbounds for I in eachindex(A)
s += A[I]
end
end
s
end
r1 = 2:size(A,1)-1
r2 = 2:size(A,2)-1
println("Access")
for v in (view(A, :, 1), sub(A, :, 1), slice(A, :, 1),
view(A, 1, :), sub(A, 1, :), slice(A, 1, :),
view(A, :, 2:3), sub(A, :, 2:3),
view(A, 2:3, :), sub(A, 2:3, :),
view(A, r1, r2), sub(A, r1, r2))
println(summary(v))
mdsum(v, 1)
n = div(10^8, length(v))
print(" mdsum: ")
@time mdsum(v, n)
sumlinear(v, 1)
print("sumlinear: ")
@time sumlinear(v, n)
sumcart(v, 1)
print(" sumcart: ")
@time sumcart(v, n)
sumiter(v, 1)
print(" sumiter: ")
@time sumiter(v, n)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment