第一次打电话给朱莉娅很慢

时间:2016-12-14 18:44:34

标签: performance api module compilation julia

此问题涉及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   

使用编译好处的一种hacky方法是以某种方式在已经活跃的julia进程中复制/粘贴代码。这是可行/推荐的吗?(我迫切希望能够快速完成。等待15到20分钟进行2s分析并不合适)

1 个答案:

答案 0 :(得分:4)

可以在模块中包含const值。它们可以根据需要出口。

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

__precompile__(true)

module ModuleName
# ...
end # module ModuleName

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

  

__ precompile __()不应该在模块中使用,除非它的所有依赖项也使用__precompile __()。不这样做可以   加载模块时会导致运行时错误。