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



这个问题涉及朱莉娅的首次加载性能

我正在从命令行运行朱莉娅程序。该程序旨在是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行,因此不是运行时间问题,而是汇编节目。
  • 另一个大命中来自呼吁高度超载功能。超载函数从数据库中获取数据,并且可以接受多种输入格式。

有没有办法加快这些速度?有没有办法将朱莉娅计划完全预编译?

对于更多的背景,基于API的程序通过命令行调用一次,并且随着命令行关闭朱莉娅进程,任何持久的第一汇编优点都会丢失。

$julia run_api_based_main_func.jl   

使用汇编福利的一种黑客方法是以某种方式复制/粘贴已经活跃的Julia过程中的代码。这是可行的/推荐的吗?

可以将const值包装在模块中。他们可以按照需要出口。

正如Fengyang所说,在模块中包装较大设计的独立组件很有帮助,并且会在这种情况下有所帮助。当模块内部有很多事情时,每个初始功能调用随附的预编译时间都可以加起来。有一种避免这种情况的方法 - 在using之前将内容进行预编译:

__precompile__(true)
module ModuleName
# ...
end # module ModuleName

请注意(在线帮助):

__预编译__()不应在模块中使用,除非其所有依赖关系也使用__ precompile __()。不这样做可以 加载模块时会导致运行时错误。

最新更新