计算机语言基准游戏的F# entry for Threadring包含一个看似无用的行:if false then()
。当我注释掉这一行时,程序运行速度要快得多(对于50000000的输入,大约2s vs 55s)并产生相同的结果。这个怎么用?这条线为什么在那里?编译器究竟在做什么看起来没有任何操作?在计算机语言基准游戏的F#线程环境条目中,“if then then()”的效果如何?
代码:
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为一个权威的答案(如它是),但我很好奇你为什么要惩罚_a基准_的表现有意... – ildjarn
回想起来,我相信我想要的展示不同的合法执行上下文的异步,同时仍然在同一个硬件线程上共享连续数据(对Go进行类似的使用模式)。如果没有这条线,F#会把整个事情放到一个有效的while循环中。对于基准测试来说,这样做会很花哨,但只要您尝试将代码用于某个真实的东西,性能就会下降20倍左右。 –