为了测量这些 Refs 的性能,我将 GHC 生成的程序集转储到以下代码中:
import Data.IORef
main = do
r <- newIORef 18
v <- readIORef r
print v
我希望 IORef 被完全优化掉,只留下一个系统调用来用字符串“18”编写标准输出。相反,我得到了 250 条装配线。你知道有多少人会被处决吗?这是我认为该程序的核心:
.globl Main.main1_info
Main.main1_info:
_c1Zi:
leaq -8(%rbp),%rax
cmpq %r15,%rax
jb _c1Zj
_c1Zk:
movq $block_c1Z9_info,-8(%rbp)
movl $Main.main2_closure+1,%ebx
addq $-8,%rbp
jmp stg_newMutVar#
_c1Zn:
movq $24,904(%r13)
jmp stg_gc_unpt_r1
.align 8
.long S1Zo_srt-(block_c1Z9_info)+0
.long 0
.quad 0
.quad 30064771104
block_c1Z9_info:
_c1Z9:
addq $24,%r12
cmpq 856(%r13),%r12
ja _c1Zn
_c1Zm:
movq 8(%rbx),%rax
movq $sat_s1Z2_info,-16(%r12)
movq %rax,(%r12)
movl $GHC.Types.True_closure+2,%edi
leaq -16(%r12),%rsi
movl $GHC.IO.Handle.FD.stdout_closure,%r14d
addq $8,%rbp
jmp GHC.IO.Handle.Text.hPutStr2_info
_c1Zj:
movl $Main.main1_closure,%ebx
jmp *-8(%r13)
我很担心这个jmp stg_newMutVar#
。它不在程序集中的其他位置,因此 GHC 可能会在稍后的链接阶段解决它。但为什么它甚至在这里,它有什么作用?我可以在没有任何未解析的 haskell 符号的情况下转储最终程序集吗?