导入无关包后,Julia的性能下降

时间:2019-02-20 14:49:19

标签: performance julia data-science

导入不相关的软件包deepcopy后,CSV的性能会受到影响。我该如何解决?

import BenchmarkTools
mutable struct GameState
    gameScore::Vector{Int64}
    setScore::Vector{Int64}
    matchScore::Vector{Int64}
    serve::Int64
end
BenchmarkTools.@benchmark deepcopy(GameState([0,0],[0,0],[0,0],-1))

BenchmarkTools.Trial: 
  memory estimate:  1.02 KiB
  allocs estimate:  10
  --------------
  minimum time:     1.585 μs (0.00% GC)
  median time:      1.678 μs (0.00% GC)
  mean time:        2.519 μs (27.10% GC)
  maximum time:     5.206 ms (99.88% GC)
  --------------
  samples:          10000
  evals/sample:     10

import CSV

BenchmarkTools.@benchmark deepcopy(GameState([0,0],[0,0],[0,0],-1))

BenchmarkTools.Trial: 
  memory estimate:  1.02 KiB
  allocs estimate:  10
  --------------
  minimum time:     6.709 μs (0.00% GC)
  median time:      7.264 μs (0.00% GC)
  mean time:        9.122 μs (18.00% GC)
  maximum time:     13.289 ms (99.87% GC)
  --------------
  samples:          10000
  evals/sample:     5

更新:建议解决方案的代码

import Base:deepcopy
function deepcopy(x::GameState)
    return GameState([x.gameScore[1], x.gameScore[2]], [x.setScore[1], x.setScore[2]], [x.matchScore[1], x.matchScore[2]],x.serve)
end

BenchmarkTools.@benchmark deepcopy(GameState([0,0],[0,0],[0,0],-1))
BenchmarkTools.Trial: 
  memory estimate:  672 bytes
  allocs estimate:  8
  --------------
  minimum time:     184.436 ns (0.00% GC)
  median time:      199.305 ns (0.00% GC)
  mean time:        256.366 ns (21.29% GC)
  maximum time:     102.345 μs (99.52% GC)
  --------------
  samples:          10000
  evals/sample:     656

1 个答案:

答案 0 :(得分:10)

至少有两种可能性:

  • 代码中的某些内容需要运行时分配。导入CSV会添加新方法,从而使一个或多个键功能的方法表更长。由于运行时分派具有更多的评估可能性,因此它会变慢。 解决方案:确保您的代码是"type stable" (inferrable),那么Julia无需执行运行时调度。请参阅Performance tips page入门。
  • CSV中的某件事正在type-piracy上执行,它的实施使您的速度变慢。

我将赌注押在前者上。使用ProfileView.jl以图形方式轻松检测运行时调度。如果您在剖析rungame时在顶部看到很多红色条,则说明您已找到问题的根源。除了与CSV交互之外,消除这些红色条可能会给您带来巨大的性能提升。