gpt4 book ai didi

benchmarking - Julia 语言真的像它声称的那么快吗?

转载 作者:行者123 更新时间:2023-12-03 07:02:20 27 4
gpt4 key购买 nike

已关注 this post我决定将 Julia 与 GNU Octave 进行基准测试,结果与 julialang.org 中所示的加速不一致。 .

我使用 CXXFLAGS='-std=c++11 -O3' 编译了 Julia 和 GNU Octave,得到的结果:

GNU Octave

a=0.9999;

tic;y=a.^(1:10000);toc
Elapsed time is 0.000159025 seconds.

tic;y=a.^(1:10000);toc
Elapsed time is 0.000162125 seconds.

tic;y=a.^(1:10000);toc
Elapsed time is 0.000159979 seconds.

--

tic;y=cumprod(ones(1,10000)*a);toc
Elapsed time is 0.000280142 seconds.

tic;y=cumprod(ones(1,10000)*a);toc
Elapsed time is 0.000280142 seconds.

tic;y=cumprod(ones(1,10000)*a);toc
Elapsed time is 0.000277996 seconds.

Julia

tic();y=a.^(1:10000);toc()
elapsed time: 0.003486508 seconds

tic();y=a.^(1:10000);toc()
elapsed time: 0.003909662 seconds

tic();y=a.^(1:10000);toc()
elapsed time: 0.003465313 seconds

--

tic();y=cumprod(ones(1,10000)*a);toc()
elapsed time: 0.001692931 seconds

tic();y=cumprod(ones(1,10000)*a);toc()
elapsed time: 0.001690245 seconds

tic();y=cumprod(ones(1,10000)*a);toc()
elapsed time: 0.001689241 seconds

有人能解释一下为什么 Julia 在这些基本操作上比 GNU Octave 慢吗?预热后,应该可以无开销地调用 LAPACK/BLAS,对吗?

编辑:

正如评论和答案中所解释的,上面的代码不是一个好的基准,也不能说明在实际应用程序中使用该语言的好处。我曾经认为 Julia 是一个更快的“Octave/MATLAB”,但它远不止于此。这是朝着高效、高性能、科学计算迈出的一大步。通过使用 Julia,我能够 1) 超越我研究领域中用 Fortran 和 C++ 编写的软件,2) 为用户提供更好的 API。

最佳答案

.^ 这样的矢量化操作正是 Octave 所擅长的,因为它们实际上完全是用专门的 C 代码实现的。在构建 Octave 时编译的代码中的某个位置,有一个 C 函数用于计算 double 型和 double 型数组的 .^ – 这就是您在这里真正计时的内容,而且速度很快,因为它是用 C 语言编写的。另一方面,Julia 的 .^ 运算符是用 Julia 编写的:

julia> a = 0.9999;

julia> @which a.^(1:10000)
.^(x::Number,r::Ranges{T}) at range.jl:327

该定义包含以下内容:

.^(x::Number, r::Ranges) = [ x^y for y=r ]

它使用一维数组理解将 x 提升为 r 范围内的每个值 y,并将结果作为向量返回.

Edward Garson 说得非常正确,不应该在 Julia 中使用全局变量来获得最佳性能。原因是编译器无法很好地推理全局变量的类型,因为它们可以在执行离开当前作用域的任何点上发生变化。离开当前作用域听起来并不经常发生,但在 Julia 中,即使是索引数组或添加两个整数之类的基本操作实际上也是方法调用,因此会离开当前作用域。然而,在这个问题的代码中,所有时间都花在 .^ 函数内,因此 a 是全局的这一事实实际上并不重要:

julia> @elapsed a.^(1:10000)
0.000809698

julia> let a = 0.9999;
@elapsed a.^(1:10000)
end
0.000804208

最终,如果您所做的只是在 float 组上调用矢量化运算,那么 Octave 就可以了。然而,即使在高级动态语言中,这通常也不是实际上花费大部分时间的地方。如果您发现自己想要使用 for 循环迭代数组,使用标量算术对每个元素进行操作,您会发现 Octave 在此类事情上非常慢 – 通常比 C 或 Julia 代码慢数千倍一样的东西。另一方面,在 Julia 中编写 for 循环是一件完全合理的事情 - 事实上,我们所有的排序代码都是用 Julia 编写的,并且在性能上与 C 相当。使用 Julia 还有许多其他与性能无关的原因。作为 Matlab 的克隆,Octave 继承了 Matlab 的许多设计问题,并且作为通用编程语言表现不佳。例如,您不想在 Octave 或 Matlab 中编写 Web 服务,但它是 quite easy在 Julia 中这样做。

关于benchmarking - Julia 语言真的像它声称的那么快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19208014/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com