怎么知道一个操作构造了新对象,产生了gc时间

例如a[1,1]和a[:,1]有些区别,在使用的好像后者要慢一些

可以用 @time

julia> a = rand(2,2)
2×2 Array{Float64,2}:
 0.0267524  0.691183
 0.674876   0.729643

julia> @time a[1,1]
  0.000002 seconds (5 allocations: 176 bytes)
0.026752448940208895

julia> @time a[:,1]
  0.000007 seconds (6 allocations: 272 bytes)
2-element Array{Float64,1}:
 0.026752448940208895
 0.6748763817412906

julia> @time a[1,:]
  0.032593 seconds (72.49 k allocations: 3.573 MiB, 10.32% gc time)
2-element Array{Float64,1}:
 0.026752448940208895
 0.6911830907916054

当然示例中的 a 很小,不一定会出现像最后那样的 gc
关于 gc time 详见 Timing in Julia – pkofod
from —— julia代码执行时间gc time优化要合理,这是一个失败的案例

最好使用 Benchmark.jl 里的 @btime, 尤其是在 global scope 里,@time给出的结果是有问题的。

假设a是从1开始的矩阵, a[1,1]得到矩阵的1,1元素, a[:, 1] 得到矩阵第一列. 不过这个速度差别不是因为GC.

如果你说的是这种情况的话,

julia> using BenchmarkTools

julia> a = zeros()
0-dimensional Array{Float64,0}:
0.0

julia> @btime a[1,1]
  20.874 ns (1 allocation: 16 bytes)
0.0

julia> @btime a[:,1]
  435.813 ns (2 allocations: 112 bytes)
1-element Array{Float64,1}:
 0.0

julia> g(a, i) = a[:, i]
g (generic function with 1 method)

julia> @btime @inbounds g($a, 1)
  40.052 ns (1 allocation: 96 bytes)
1-element Array{Float64,1}:
 0.0

那是因为Julia认为 a[:, 1] 要有个循环, 但 a[1,1] 直接读取元素.