【问题标题】:Julia pi approximation slowJulia pi 逼近缓慢
【发布时间】:2016-08-26 07:59:27
【问题描述】:

我的 pi 近似代码与官方页面上的非常相似:

function piaprox()
    sum = 1.0
    for i = 2:m-1
        sum = sum + (1.0/(i*i))
    end
end

m = parse(Int,ARGS[1])
opak = parse(Int,ARGS[2])

@time for i = 0:opak
    piaprox()
end

当我尝试比较 C 和 Julia 的时间时,Julia 的速度明显变慢,m = 100000000 时几乎为 38 秒(C 的时间为 0.1608328933 秒)。为什么会这样?

【问题讨论】:

    标签: julia


    【解决方案1】:
    julia> m=100000000 
    julia> function piaprox()
               sum = 1.0
               for i = 2:m-1
                   sum = sum + (1.0/(i*i))
               end
           end
    piaprox (generic function with 1 method)
    
    julia> @time piaprox()
     28.482094 seconds (600.00 M allocations: 10.431 GB, 3.28% gc time)
    

    我想提一下来自 julia 文档的 Performance Tips 部分的两个非常重要的段落:

    Avoid global variables 一个全局变量可能有它的值,并且 因此它的类型,随时改变。这使得很难 编译器使用全局变量优化代码。变量应该 尽可能是本地的,或者作为参数传递给函数.....

    @code_warntype(或其函数变体code_warntype())可以 有时有助于诊断与类型相关的问题。

    julia> @code_warntype piaprox();
    Variables:
      sum::Any
      #s1::Any
      i::Any
    

    @code_warntype 输出中可以清楚地看出,编译器无法识别piaprox() 中的局部变量类型。所以我们尝试声明类型并移除全局变量:

    function piaprox(m::Int)
        sum::Float64 = 1.0
        i::Int = 0
        for i = 2:m-1
            sum = sum + (1.0/(i*i))
        end
    end
    julia> @time piaprox(100000000 )
      0.009023 seconds (11.10 k allocations: 399.769 KB)
    julia> @code_warntype piaprox(100000000);
    Variables:
      m::Int64
      sum::Float64
      i::Int64
      #s1::Int64
    

    编辑

    正如@user3662120 评论的那样,答案的超快速行为是错误的结果,没有返回值 LLVM 可能会忽略 for 循环,通过添加返回行 @time 结果将是:

    julia> @time piaprox(100000000)
      0.746795 seconds (11.11 k allocations: 400.294 KB, 0.45% gc time)
    1.644934057834575
    

    【讨论】:

    • 请注意,msum 上的类型注释对于速度来说不是必需的。
    • 类型注解 (::Int, ::Float64) 实际上对这里的性能没有任何贡献。 (添加无用的类型注释是 Julia 的常见错误。)还请注意,您忘记返回总和。 (LLVM 实际上可能会优化整个循环!)
    猜你喜欢
    • 2021-02-22
    • 1970-01-01
    • 2013-10-01
    • 2010-12-25
    • 2019-05-19
    • 2021-01-03
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多