gpt4 book ai didi

julia - Julia 没有评估该函数吗?

转载 作者:行者123 更新时间:2023-12-02 18:19:18 25 4
gpt4 key购买 nike

我正在研究 Collat​​z 猜想(见下文),并且我有这个函数:

function txpo(max_n)
for n ∈ 1:max_n
x = n
while x ≥ n && x != 1
x = iseven(x) ? x÷2 : 3x+1
end
end
end

我故意不返回任何东西或检查任何东西,以使其尽可能快。天哪,速度快吗... - 实际上太快了,我想。

using BenchmarkTools
@btime txpo(100_000_000_000_000_000_000_000_000_000_000_000_000)

2.337 ns (0 allocations: 0 bytes)

运行 10^38 个 while 循环只需要 2ns? Julia 很快,但如果有那么快我会感到惊讶。看起来代码没有被评估。或者我在这里缺少什么?


科拉茨猜想取一个整数并使用以下规则构建一个级数:如果该数字是偶数除以 2;如果数字是奇数乘以3并加1。猜想:每个系列最终都会进入循环4-2-1-4

最佳答案

确实,整个函数体都被优化掉了:

julia> function txpo(max_n)
for n ∈ 1:max_n
x = n
while x ≥ n && x != 1
x = iseven(x) ? x÷2 : 3x+1
end
end
end
txpo (generic function with 1 method)

julia> @code_llvm txpo(100000000000)
; @ REPL[1]:1 within `txpo`
define void @julia_txpo_179(i64 signext %0) #0 {
top:
; @ REPL[1]:5 within `txpo`
ret void
}

如果您使用 10^38,这只会更改函数签名以接受 128 位整数。

LLVM IR 代码与此 Julia 代码基本相同:

julia_txpo_179(_0::Int64) = nothing

这是完全有道理的,因为为什么要执行一个不返回任何依赖于其计算且没有副作用的函数?

最后,CPU 执行的 native 代码实际上是 retq,又名“返回调用者”:

julia> @code_native txpo(100000000000)
.section __TEXT,__text,regular,pure_instructions
; ┌ @ REPL[1]:5 within `txpo`
retq
nopw %cs:(%rax,%rax)
; └

julia>

关于julia - Julia 没有评估该函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71092165/

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