此问题涉及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是数据库连接和数据库集合以及其他复杂对象)。
[编辑] 我确实在一个模块中包装了API.jl,但是没有性能提升。
lm(y~X, df)
)产生了巨大的性能影响。 df
只有2列和3行,因此它不是运行时问题,而是编译速度慢。有没有办法加快这些速度?有没有办法完全预编译julia程序?
对于更多背景知识,基于API的程序通过命令行调用一次,并且随着命令行关闭Julia进程,任何持久的第一个编译优势都会丢失。
$julia run_api_based_main_func.jl
使用编译好处的一种hacky方法是以某种方式在已经活跃的julia进程中复制/粘贴代码。这是可行/推荐的吗?(我迫切希望能够快速完成。等待15到20分钟进行2s分析并不合适)
答案 0 :(得分:4)
可以在模块中包含const值。它们可以根据需要出口。
正如凤阳所说,在模块中包装更大设计的独立组件是有帮助的,并将有助于这种情况。当模块内部发生大量事件时,每个初始函数调用所伴随的预编译时间可能会累加起来。有一种方法可以避免这种情况 - 在using
模块之前预编译内容:
__precompile__(true)
module ModuleName
# ...
end # module ModuleName
请注意(来自在线帮助):
__ precompile __()不应该在模块中使用,除非它的所有依赖项也使用__precompile __()。不这样做可以 加载模块时会导致运行时错误。