【发布时间】: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