如果不了解您是如何为 Julia 代码计时的,就不可能说出来。然而,最可能的解释是您正在计时编译时间和执行时间。 Julia 和 MatLab 编译器的行为完全不同。当你在 Julia 中编写一个新函数时,它会在你第一次使用它时被编译。因此,它的第一次执行会很慢,但所有后续调用都很快。为了解决这个问题,如果您对 Julia 进行基准测试,建议您使用 BenchmarkTools 包。在我的(不是特别特别的)机器上:
function sum_test(a)
for i = 1:1e6
a = a + i
end
return a
end
using BenchmarkTools
@btime sum_test(1)
产生以下输出:
julia> @btime sum_test(1)
2.135 ms (0 allocations: 0 bytes)
大约 2 毫秒,大约是 MatLab 运行速度的两倍。
但是我们可以做得更好吗?我们当然可以。 MatLab 倾向于将所有数字视为双精度浮点数,因此在 MatLab 中编码时不会过多考虑数字的类型。在 Julia 中,情况并非如此。在此示例中,您已将循环的上限指定为 1e6。请注意:
julia> typeof(1e6)
Float64
啊哈!您可能不希望循环变量是Float64,而是希望它是一个整数。那么当我们改变它时会发生什么?尝试运行:
function sum_test(a)
for i = 1:1000000
a = a + i
end
return a
end
using BenchmarkTools
@btime sum_test(1)
现在输出:
julia> @btime sum_test(1)
1.208 ns (0 allocations: 0 bytes)
是的,您没看错。耗时 1.2 纳秒,比 MatLab 快大约 6 个数量级。
那么发生了什么?在循环上限是整数的情况下,Julia 编译器足够聪明地意识到它实际上并不需要运行循环来正确计算结果。由于正在执行的算法的性质,可以使用编译器为您完成的单个公式确定答案。换句话说,Julia 编译器优化了整个循环!