die Leistung dieser Refs zu messen, abgeladen ich die Montage von GHC auf dem folgenden Code erzeugt:Erstellung von IOREF und STref
import Data.IORef
main = do
r <- newIORef 18
v <- readIORef r
print v
ich die IOREF erwartet entfernt vollständig optimiert werden, nur eine syscall verlassen zu schreibe stdout mit der Zeichenkette "18". Stattdessen bekomme ich 250 Zeilen Assembly. Weißt du wie viele tatsächlich ausgeführt werden? Hier ist, was ich denke, das Herz des Programms ist:
.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)
Ich bin besorgt über diese jmp stg_newMutVar#
. Es ist nirgendwo in der Versammlung, also vielleicht GHC löst es in einer späteren Verknüpfungsphase. Aber warum ist es überhaupt hier und was macht es? Kann ich die endgültige Baugruppe ohne ungelöste Haskell-Symbole ausgeben?
Ich bezweifle, dass GHC jede relevante Optimierung auf den IO-Referenzen durchführen kann. GCC macht das auf dem äquivalenten "malloc" -Snippet, aber das ist viel mehr idiomatischer Code in C als in Haskell. Das 'stg_' Zeug ist die GHC Laufzeit, es sollte irgendwo in den GHC Quellen in C implementiert werden. Nicht für schwache Nerven. – chi