Julia是否不适合for循环量过大的情况?

Julia在一个不经意的瞬间吸引了我,我为此也花费了大量的时间和精力去学习和改我之前的代码。但我从matlab改到Julia以后,在同样的近乎直接翻译的情况下其速度是相当的慢!Julia的有很多改进性能的建议,我每天不停的翻来翻去,我相信应该是掌握了不少诀窍。我将其中一个耗时的子程序,拆解为十几个小function,实际上速度仍未有明显的提高,比matlab要慢15倍!

看过一个帖子有人说Julia的底层可能优化不够,我个人觉得这是极有可能的。

我的算例的规模稍大,Julia的提速算例往往都是一些简单的算例,对于我这种规模稍微大的综合性程序少见。当然我个人的认知也有一定的限制。目前就我的理解而言,Julia的速度比matlab还慢难以接受。

我的代码有点太长了,没法发到这里给大家修改。而且这个涉及到自己的知识产权。

这个程序只能搁置了,或许在某个瞬间,某个idea能重新激活它。

没有关系。Julia性能不会比MATLAB差,你写的有问题。不放代码讲性能就是耍流氓。talk is cheap

代码有二十多个jl文件,没法放。我还没学到家,我在学学。Julia应该没问题。

二十多个文件说明你连基本的profile都没做过。

我正在研究怎么弄,到时候调整好了,我会向网友汇报。

先性能测试一下,然后翻翻 性能建议 · Julia中文文档

怎么测,这里有个实际的例子:

谢谢,我用了profile.print()输出分析的结果,可是我完全看不懂这个到底是什么意思阿?另外怎么才能看memory的信息阿?
比如部分截取:
4 …er\abstractinterpretation.jl:1213; typeinf_local(::Core.Compiler.InferenceState)
╎ ╎ ╎ ╎ 4 …er\abstractinterpretation.jl:974; abstract_eval(::Any, ::Array{Any,1}, ::Core…
╎ ╎ ╎ ╎ 4 …r\abstractinterpretation.jl:880; abstract_call(::Array{Any,1}, ::Array{Any,1…
╎ ╎ ╎ ╎ 4 …r\abstractinterpretation.jl:895; abstract_call(::Array{Any,1}, ::Array{Any,…
╎ ╎ ╎ ╎ 4 …r\abstractinterpretation.jl:873; abstract_call_known(::Any, ::Array{Any,1},…
╎ ╎ ╎ ╎ 3 …\abstractinterpretation.jl:124; abstract_call_gf_by_type(::Any, ::Array{A…
╎ ╎ ╎ ╎ ╎ 3 …\abstractinterpretation.jl:251; abstract_call_method_with_const_args(::A…
╎ ╎ ╎ ╎ ╎ 2 @Base\compiler\typeinfer.jl:12; typeinf(::Core.Compiler.InferenceState)
╎ ╎ ╎ ╎ ╎ 2 …abstractinterpretation.jl:1283; typeinf_nocycle(::Core.Compiler.Inferen…
╎ ╎ ╎ ╎ ╎ 2 …bstractinterpretation.jl:1227; typeinf_local(::Core.Compiler.Inferenc…

matlab和julia跑的时候cpu占用一样吗

可以把整个输出放出来吗?最好profile一遍以后做 Profile.clear() 再profile一遍。要不然会看到很多Julia编译器内部的函数。

楼主用什么运行的?建议直接用CMD运行文件,反正我用IDEA编译器速度会变慢

我是用的vscode编程序,用include直接在julia repl里面运行,对于简单的小规律问题速度还是可以的,但是规模变大速度就很慢!

您能不能告诉一下,测试内存的具体方法阿?Windows的。我在shell里面用julia --allocation-track=user设置后,我运行一个程序然后关闭Julia,找不到有.mem文件阿。万分感谢!

用atom里juno插件的profiler吧,这个比较容易上手。装了atom以后@profiler 后面加要profile的代码即可。

内存我已经从1.6GiB优化到70MiB了,我发现在子程序里面有args= zeros(…)会开辟内存,随着循环量加大这个内存也会无止境的加大,请问这个该如何优化?子程序的最外层是一个for循环,循环量级可百万次。另外,内存优化完以后,使用profile去进一步优化?profile的使用已经掌握了,但是不知道如何分析里面的内容。这个哪里有介绍阿?谢谢!还有个问题,一般你们编程序会使用return吗?但是有些子程序必须要return才行阿,内存优化的时候,我发现含return的子程序也会站不少内存,搞不清楚什么原因。

只做了allocation的优化,profile的确实还没弄。

这个没分析过,但是同样的代码,用Julia改写的话必须得按它的游戏规则玩,否则速度跟不上matlab。拙见

尽量避免循环内分配内存吧,提前分配好固定的缓冲区。Julia会在下一次分配内存时触发GC,但是不保证立刻回收你的内存。

该return就return,具体情况具体分析,和内存关系不大。

但是有些矩阵的大小未知,需要在子程序里面确定后预分配,这种情况怎么处理?

和你分享一个我之前遇到的情况:我之前有一个程序,会对组合情况进行计算,中间会产生2000个临时数据文件,当时我尝试动态合并,发现速度很慢,我直接把临时文件保存到本地,全部计算完,在下一个环节里,一次性读取这些文件【读取的时候,第一遍统计这些文件加起来一共有多少行,比如有100万行,则开辟一个100万行矩阵,然后再逐个文件读入矩阵】。

搞个大点的矩阵,然后用@view,在大矩阵的内存中填数据。不必要每次都重新划分新内存。或者你不去管它内存划分,占用大了,他自然会回收,好像不像python一样,引用为0就立即回收。
其实matlab也有很多规矩的,大家都得遵守。