当我们没有类型稳定性时会发生什么呢?我们来看看这段代码:
- @code_native ^(2,5)
-
- .text
- ; Function ^ {
- ; Location: intfuncs.jl:220
- pushq %rax
- movabsq $power_by_squaring, %rax
- callq *%rax
- popq %rcx
- retq
- nop
- ;}
现在让我们定义对整数的取幂,让它像其他脚本语言中看到的那样「安全」:
- function expo(x,y)
- if y>0
- return x^y
- else
- x = convert(Float64,x)
- return x^y
- end
- end
output: expo (generic function with 1 method)
确保它有效:
- println(expo(2,5))
- expo(2,-5)
output: 32
0.03125
当我们检查这段代码时会发生什么?
- @code_native expo(2,5)
-
-
-
- .text
- ; Function expo {
- ; Location: In[8]:2
- pushq %rbx
- movq %rdi, %rbx
- ; Function >; {
- ; Location: operators.jl:286
- ; Function <; {
- ; Location: int.jl:49
- testq %rdx, %rdx
- ;}}
- jle L36
- ; Location: In[8]:3
- ; Function ^; {
- ; Location: intfuncs.jl:220
- movabsq $power_by_squaring, %rax
- movq %rsi, %rdi
- movq %rdx, %rsi
- callq *%rax
- ;}
- movq %rax, (%rbx)
- movb $2, %dl
- xorl %eax, %eax
- popq %rbx
- retq
- ; Location: In[8]:5
- ; Function convert; {
- ; Location: number.jl:7
- ; Function Type; {
- ; Location: float.jl:60
- L36:
- vcvtsi2sdq %rsi, %xmm0, %xmm0
- ;}}
- ; Location: In[8]:6
- ; Function ^; {
- ; Location: math.jl:780
- ; Function Type; {
- ; Location: float.jl:60
- vcvtsi2sdq %rdx, %xmm1, %xmm1
- movabsq $__pow, %rax
- ;}
- callq *%rax
- ;}
- vmovsd %xmm0, (%rbx)
- movb $1, %dl
- xorl %eax, %eax
- ; Location: In[8]:3
- popq %rbx
- retq
- nopw %cs:(%rax,%rax)
- ;}
这个演示非常直观地说明了为什么 Julia 使用类型推断来实现能够比其他脚本语言有更高的性能。
核心观念:多重分派+类型稳定性 => 速度+可读性
类型稳定性(Type stability)是将 Julia 语言与其他脚本语言区分开的一个重要特征。实际上,Julia 的核心观念如下所示:
(引用)多重分派(Multiple dispatch)允许语言将函数调用分派到类型稳定的函数。 (编辑:广安站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|