mapreduce
bisa jauh lebih lambat daripada for
yang setara -loop. Contoh kecil ( kehidupan nyata ):
function dsum(A::Matrix)
z = zero(A[1,1])
n = Base.LinAlg.checksquare(A)
B = Vector{typeof(z)}(n)
<strong i="9">@inbounds</strong> for j in 1:n
B[j] = mapreduce(k -> A[j,k]*A[k,j], +, z, 1:j)
end
B
end
function dfor(A::Matrix)
z = zero(A[1,1])
n = Base.LinAlg.checksquare(A)
B = Vector{typeof(z)}(n)
<strong i="10">@inbounds</strong> for j in 1:n
d = z
for k in 1:j
d += A[j,k]*A[k,j]
end
B[j] = d
end
B
end
A = randn(127,127)
time(median(<strong i="11">@benchmark</strong> dsum(A)))/time(median(<strong i="12">@benchmark</strong> dfor(A)))
memberi saya rasio kinerja sekitar x50 pada Julia 0,5, juliabox.com. Saya pikir ini bisa jadi karena for
-loop dapat secara otomatis simd
, dan mapreduce bukan? Ketika A = randn(N,N)
dan N
adalah 16
, selisihnya sekitar x75, dan untuk N = 10000
, selisihnya sekitar x25. Mengganti akses array A[j,k]
dengan A[rand(1:size(A,1)),rand(1:size(A,2))]
merusak kinerja keduanya, tetapi rasionya menjadi x1.
simd
alasan mengapa seseorang x50 lebih cepat?mapreduce
mendasari sum
, jadi ini bisa menjadi jebakan populer yang saat ini tidak disebutkan(Pembandingan mapreduce
versus for
-loop tanpa akses array, saya masih melihat kesenjangan kinerja x2. Misalnya mapreduce(identity, +, 0, i for i in 1:n)
versus loop penjumlahan bilangan bulat for
yang setara. Sepertinya celah ini dulunya lebih kecil ? Layak benchmark lain di CI?)
Sepertinya dup dari https://github.com/JuliaLang/julia/issues/15276.
Sedang mengerjakan:
function dsum(A::Matrix)
z = zero(A[1,1])
n = Base.LinAlg.checksquare(A)
B = Vector{typeof(z)}(n)
<strong i="8">@inbounds</strong> for j::Int in 1:n
B[j] = _help(A, j, z)
end
B
end
_help(A, j, z) = mapreduce(k -> A[j,k]*A[k,j], +, z, 1:j)
memberi
julia> time(median(<strong i="12">@benchmark</strong> dsum(A)))/time(median(<strong i="13">@benchmark</strong> dfor(A)))
1.0013213312412255
Anda dapat melihat masalahnya dengan @code_warntype
dan mencari Core.Box
.
+1 untuk menempatkan tolok ukur ini di BaseBenchmarks; PR di sana akan sangat bagus.
Ditutup sebagai duplikat dari #15276.
Komentar yang paling membantu
+1 untuk menempatkan tolok ukur ini di BaseBenchmarks; PR di sana akan sangat bagus.