【发布时间】:2017-11-14 03:18:41
【问题描述】:
在使用 Matlab 几年后,我开始学习 Julia。我首先实现了一个简单的多项式乘法(没有 FFT)来尝试理解类型稳定性的作用。该项目的很大一部分是对快速多项式乘法器的要求。但是,我有以下时间我根本无法理解。
function cauchyproduct(L::Array{Float64},R::Array{Float64})
# good one for floats
N = length(L)
prodterm = zeros(1,2N-1)
for n=1:N
Lterm = view(L,1:n)
Rterm = view(R,n:-1:1)
prodterm[n] = dot(Lterm,Rterm)
end
for n = 1:N-1
Lterm = view(L,n+1:N)
Rterm = view(R,N:-1:n+1)
prodterm[N+n] = dot(Lterm,Rterm)
end
prodterm
end
testLength = 10000
goodL = rand(1,testLength)
goodR = rand(1,testLength)
for j in 1:10
@time cauchyproduct(goodL,goodR)
end
@which cauchyproduct(goodL,goodR)
我从该代码的 2 次连续运行中得到以下时间。这些从一次运行到另一次运行的时间是完全不稳定的。一般来说,我每次测试的时间范围在 0.05 秒到 2 秒之间。通常,通过 for 循环的单次运行的时间都将具有相似的时间(如下例所示),但情况并非总是如此。有时,我会交替使用它,例如 .05s .05s 1.9s .04s .05s 2.1s 等等等等。
知道为什么会这样吗?
0.544795 seconds (131.08 k allocations: 5.812 MiB)
0.510395 seconds (120.00 k allocations: 5.340 MiB)
0.528362 seconds (120.00 k allocations: 5.340 MiB, 0.94% gc time)
0.507156 seconds (120.00 k allocations: 5.340 MiB)
0.507566 seconds (120.00 k allocations: 5.340 MiB)
0.507932 seconds (120.00 k allocations: 5.340 MiB)
0.527383 seconds (120.00 k allocations: 5.340 MiB)
0.513301 seconds (120.00 k allocations: 5.340 MiB, 0.83% gc time)
0.509347 seconds (120.00 k allocations: 5.340 MiB)
0.509177 seconds (120.00 k allocations: 5.340 MiB)
0.052247 seconds (120.00 k allocations: 5.340 MiB, 7.95% gc time)
0.049644 seconds (120.00 k allocations: 5.340 MiB)
0.047275 seconds (120.00 k allocations: 5.340 MiB)
0.049163 seconds (120.00 k allocations: 5.340 MiB)
0.049029 seconds (120.00 k allocations: 5.340 MiB)
0.054050 seconds (120.00 k allocations: 5.340 MiB, 8.36% gc time)
0.047010 seconds (120.00 k allocations: 5.340 MiB)
0.051240 seconds (120.00 k allocations: 5.340 MiB)
0.050961 seconds (120.00 k allocations: 5.340 MiB)
0.049841 seconds (120.00 k allocations: 5.340 MiB, 4.90% gc time)
编辑:显示的时间是通过连续两次执行定义函数下的代码获得的。具体来说,代码块
goodL = rand(1,testLength)
goodR = rand(1,testLength)
for j in 1:10
@time cauchyproduct(goodL,goodR)
end
在不同的运行中给出了截然不同的时间(无需重新编译上面的函数)。在所有时间中,都调用了相同的 cauchyproduct 方法(顶级版本)。希望这可以澄清问题。
编辑2:我把最后的代码块改成下面的
testLength = 10000
goodL = rand(1,testLength)
goodR = rand(1,testLength)
for j = 1:3
@time cauchyproduct(goodL,goodR)
end
for j = 1:3
goodL = rand(1,testLength)
goodR = rand(1,testLength)
@time cauchyproduct(goodL,goodR)
end
@time cauchyproduct(goodL,goodR)
@time cauchyproduct(goodL,goodR)
@time cauchyproduct(goodL,goodR)
并在新块的 2 次重复执行中获得以下时间。
时机一:
0.045936 seconds (120.00 k allocations: 5.340 MiB)
0.045740 seconds (120.00 k allocations: 5.340 MiB)
0.045768 seconds (120.00 k allocations: 5.340 MiB)
1.549157 seconds (120.00 k allocations: 5.340 MiB, 0.14% gc time)
0.046797 seconds (120.00 k allocations: 5.340 MiB)
0.046637 seconds (120.00 k allocations: 5.340 MiB)
0.047143 seconds (120.00 k allocations: 5.341 MiB)
0.049088 seconds (120.00 k allocations: 5.341 MiB, 3.88% gc time)
0.049246 seconds (120.00 k allocations: 5.341 MiB)
时间 2:
2.250852 seconds (120.00 k allocations: 5.340 MiB)
2.370882 seconds (120.00 k allocations: 5.340 MiB)
2.247676 seconds (120.00 k allocations: 5.340 MiB, 0.14% gc time)
1.550661 seconds (120.00 k allocations: 5.340 MiB)
0.047258 seconds (120.00 k allocations: 5.340 MiB)
0.047169 seconds (120.00 k allocations: 5.340 MiB)
0.048625 seconds (120.00 k allocations: 5.341 MiB, 4.02% gc time)
0.045489 seconds (120.00 k allocations: 5.341 MiB)
0.049457 seconds (120.00 k allocations: 5.341 MiB)
好困惑。
【问题讨论】:
-
我已经编辑了原始帖子以尝试澄清情况。
-
“运行”是指当我使用 for 循环运行下部块时。 for 循环中的 10 个计时中的每一个“通常”都有相似的计时。但是重新运行该代码块(即执行 10 个额外的计时)会给出到处都是的时间。显示的块运行了两次 for 循环(总共 20 次)。
-
每次运行。每组 10 个时序对于每个时序具有相似的值。但是,再次运行该块会给出 10 个新的计时值,它们的值大不相同(正如您在上面的两个 10 块中注意到的那样)。
-
我承认提出问题的方式有点令人困惑,但我不知道为什么你被否决为-2。过于苛刻。我可以在我的机器上复制这些结果,这个问题是合理的。当投票者不解释他们在 cmets 中的行为时,可能会令人沮丧。我赞成尝试至少将其恢复为 0。
-
顺便说一句,如果输入可以保证始终为
Array{Float64,2},那么您的“好”和“坏”函数将编译为相同的代码,它可以在您当前的测试中,所以你会看不出两者之间的性能差异。请参阅here 了解更多详情。
标签: julia