【问题标题】:First call to Julia is slow第一次打电话给 Julia 很慢
【发布时间】:2017-04-30 05:07:37
【问题描述】:

这个问题涉及 Julia 的首次加载性能

我正在从命令行运行一个 Julia 程序。该程序旨在成为 API 用户无需初始化内部对象的 API。

module Internal 
   type X
     c::T1
     d::T2
     .
     ..
   end

   function do_something(a::X, arg:Any)
     #some function
   end
   export do_something
end

API.jl

using Internal

const i_of_X = X()

function wrapper_do_something(args::Any)
     do_something(i_of_X, args)
end

现在,这个 API.jl 公开给第三方用户,这样他们就不必费心去实例化内部对象了。但是,API.jl 不是模块,因此无法预编译。由于 API.jl 中有许多函数,第一次加载需要“非常”长时间。

有没有办法提高性能?我也尝试将 API.jl 包装在一个模块中,但我不知道将 const 初始化变量包装在一个模块中是否可行。这样做我也会遇到分段错误(一些 const 是数据库连接和数据库集合以及其他复杂对象)。

  • 我在 OSX 上使用 v0.5

[编辑] 我确实将 API.jl 包装在一个模块中,但没有性能提升。

  • 我进行了更深入的研究,第一次调用线性回归函数(GLM 基于模块的OLS lm(y~X, df))对性能产生了很大影响。 df 只有 2 列和 3 行,所以不是运行时问题,而是编译速度慢。
  • 另一个重大影响来自调用高度重载的函数。重载函数从数据库中获取数据,并且可以接受多种输入格式。

有没有办法加快这些速度?有没有办法完全预编译 julia 程序?

对于更多背景知识,基于 API 的程序通过命令行调用一次,并且任何持久的首次编译优势都会随着命令行关闭 Julia 进程而丢失。

$julia run_api_based_main_func.jl   

利用编译优势的一种巧妙方法是以某种方式将代码复制/粘贴到已经处于活动状态的 julia 进程中。这是可行的/推荐的吗?(我迫切希望加快速度。等待 15-20 秒进行 2 秒分析似乎不对)

【问题讨论】:

  • 你绝对应该把它包装在一个模块中。

标签: performance api module compilation julia


【解决方案1】:

可以将 const 值包装在模块中。它们可以根据需要导出。

正如凤阳所说,将较大设计的独立组件封装在模块中是有帮助的,并且在这种情况下会有所帮助。当模块内部发生大量事情时,伴随每个初始函数调用的预编译时间会累加。有一种方法可以避免这种情况——在 using 模块之前预编译内容:

__precompile__(true)

module ModuleName
# ...
end # module ModuleName

请注意(来自在线帮助):

__precompile__() 不应在模块中使用,除非其所有依赖项也使用 __precompile__()。不这样做可以 加载模块时导致运行时错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2017-07-23
    相关资源
    最近更新 更多