Computer Language Benchmarks Game のThreadring の F# エントリには、一見役に立たない行が含まれています: if false then ()
. この行をコメントアウトすると、プログラムははるかに高速に実行され (50000000 の入力に対して ~2 秒と ~55 秒)、同じ結果が得られます。これはどのように作動しますか?なぜこの行があるのですか?ノーオペレーションのように見えるものに対して、コンパイラは正確に何をしているのでしょうか?
コード:
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