Bilgisayar Dili Kıyaslama Oyunu F# entry for Threadring, görünüşte işe yaramaz bir çizgi içermektedir: if false then()
. Bu çizgiyi açıkladığımda, program çok daha hızlı çalışır (~ 500s000 giriş için ~ 55 vs) ve aynı sonucu verir. Bu nasıl çalışıyor? Bu hat neden orada? Derleyicinin no-op gibi görünen şeylerle tam olarak ne işi var?Bilgisayar Dili Kıyaslama Oyununun F # Threadring girdisinde "false then()" ifadesinin etkisi nedir?
kodu:
let ringLength = 503
let cells = Array.zeroCreate ringLength
let threads = Array.zeroCreate ringLength
let answer = ref -1
let createWorker i =
let next = (i+1)%ringLength
async { let value = cells.[i]
if false then()
match value with
| 0 -> answer := i+1
| _ ->
cells.[next] <- value - 1
return! threads.[next] }
[<EntryPoint>]
let main args =
cells.[0] <- if args.Length>0 then int args.[0] else 50000000
for i in 0..ringLength-1 do
threads.[i]<-createWorker i
let result = Async.StartImmediate(threads.[0])
printfn "%d" !answer
0
+1 yetkili bir yanıt için (olduğu gibi), ama merak ediyorum neden bir _ benchmark_ performansının nedenini cezalandırmak istersiniz ... – ildjarn
Tekrar düşünmek istediğime inanıyorum. Aynı donanım ipliği üzerinde devam eden paylaşımları paylaşırken, bağımsız meşru yürütme bağlamları olan uyumsuzlukları göstermek (Go goroutines'e benzer bir kullanım modeli yapmak). Hatsız olarak, F # her şeyi etkin bir şekilde bir döngü içine alırdı. Bu bir kıyaslama için canlandırıcı olacak, ancak kodu gerçek bir şey için kullanmaya çalıştığınız anda, performans 20x oranında düşecektir. –