use*_*575 4 performance benchmarking julia
最近,我对Julia-lang很感兴趣,因为它声称是一种具有接近C性能的动态语言.但是,到目前为止我对它的体验并不好(至少表现明智).我正在编写的应用程序需要随机访问特定的数组索引,然后将它们的值与其他特定的数组索引进行比较(通过多次迭代).以下代码模拟了我对程序的需求:我的Julia代码在大约8秒内完成执行,而java脚本代码在chrome环境中需要不到1秒!我是否在使用Julia代码做错了什么?非常感谢提前.
朱莉娅代码在这里:
n=5000;
x=rand(n)
y=rand(n)
mn=ones(n)*1000;
tic();
for i in 1:n;
for j in 1:n;
c=abs(x[j]-y[i]);
if(c<mn[i])
mn[i]=c;
end
end
end
toc();
Run Code Online (Sandbox Code Playgroud)
Javascript代码:(>比上面的julia代码快8倍!)
n=5000; x=[]; y=[]; mn=[];
for(var i=0; i<n; i++){x.push(Math.random(1))}
for(var i=0; i<n; i++){y.push(Math.random(1))}
for(var i=0; i<n; i++){mn.push(1000)}
console.time('test');
for(var i=0; i<n; i++){
for(var j=0; j<n; j++){
c=Math.abs(x[j]-y[i]);
if(c<mn[i]){
mn[i]=c;
}
}
}
console.timeEnd('test');
Run Code Online (Sandbox Code Playgroud)
避免全局变量
全局变量可能具有其值,因此其类型随时都会发生变化.这使编译器难以使用全局变量优化代码.变量应该是本地的,或者尽可能作为参数传递给函数.
任何性能关键或基准测试的代码都应该在函数内部.
我们发现全局名称通常是常量,并且将它们声明为大大提高了性能:
julia> const n = 5000; const x, y = rand(n), rand(n); const mn = fill(1000.0, n);
julia> function foo!(mn, x, y)
n = length(mn)
@inbounds for i in 1:n, j in 1:n
c = abs(x[j] - y[i])
if(c < mn[i])
mn[i] = c
end
end
return mn
end
foo! (generic function with 1 method)
julia> using BenchmarkTools: @btime
julia> @btime foo!(mn, x, y)
15.432 ms (0 allocations: 0 bytes)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |