这个问题涉及朱莉娅的首次加载性能
我正在从命令行运行朱莉娅程序。该程序旨在是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 __()。不这样做可以 加载模块时会导致运行时错误。