最近,我对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();
Javascript代码:(&gt;比上面的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');
答案 0 :(得分:7)
避免全局变量
全局变量可能具有其值,因此其类型也会发生变化 在任何时候。这使编译器难以优化 代码使用全局变量。变量应该是本地的,或者作为传递 函数的参数,只要有可能。
任何对性能至关重要或正在进行基准测试的代码都应该是 在一个函数内部。
我们发现全局名称通常是常量,并声明它们 因此大大提高了性能:
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)
答案 1 :(得分:4)
Julia代码应始终位于函数内部,以便编译器可以对其进行优化。此外,您正在测量编译时间和执行时间:要获得准确的度量,您应该调用该函数两次(第一次用于编译)。
function test(n)
x=rand(n);
y=rand(n);
mn=ones(n)*1000;
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
(mn, x, y)
end
test(1)
@time test(5000);
我的笔记本电脑需要0.04秒。铬1s中的javascript (firefox web console 53s中的javascript)