为什么我的Julia代码比javascript运行得慢?

时间:2018-05-02 17:36:09

标签: performance julia benchmarking

最近,我对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');

2 个答案:

答案 0 :(得分:7)

Performance Tips

  

避免全局变量

     

全局变量可能具有其值,因此其类型也会发生变化   在任何时候。这使编译器难以优化   代码使用全局变量。变量应该是本地的,或者作为传递   函数的参数,只要有可能。

     

任何对性能至关重要或正在进行基准测试的代码都应该是   在一个函数内部。

     

我们发现全局名称通常是常量,并声明它们   因此大大提高了性能:

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)