performance - 为什么我的 Julia 代码运行速度比 javascript 慢?

标签 performance julia benchmarking

最近,我对 Julia-lang 很感兴趣,因为它声称是一种具有接近 C 性能的动态语言。但是,到目前为止我对它的体验并不好(至少在性能方面)。
我正在编写的应用程序需要随机访问特定数组索引,然后将它们的值与其他特定数组索引(经过多次迭代)进行比较。以下代码从程序中模拟了我的需求:
我的 Julia 代码在大约 8 秒内完成执行,而 Java 脚本代码在 chrome 环境中需要不到 1 秒的时间!
我的 Julia 代码有问题吗?非常感谢。

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 代码:(比上面的 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');

最佳答案

Performance Tips

Avoid global variables

A global variable might have its value, and therefore its type, change at any point. This makes it difficult for the compiler to optimize code using global variables. Variables should be local, or passed as arguments to functions, whenever possible.

Any code that is performance critical or being benchmarked should be inside a function.

We find that global names are frequently constants, and declaring them as such greatly improves performance:



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)

关于performance - 为什么我的 Julia 代码运行速度比 javascript 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50140490/

相关文章:

go - 对我的 Golang 网络服务器进行基准测试

c# - TableLayoutPanel 对事件的响应非常慢

julia - 可用作宏中运算符的 ASCII 字符序列

linux - 检测 CPU 功能支持(例如 sse2、fma4 等)

Java 循环在一些运行/JIT 故障后变慢?

c# - Java 与 C# : Are there any studies that compare their execution speed?

javascript - 编写自定义 .on()/.bind() JavaScript 的最高效方式

MySQL查询计算列

java - OpenJpa 查询缓存在空值的情况下不刷新

loops - 如何在 julia 中使用数组元素作为迭代器?