gpt4 book ai didi

f# - "if false then ()"在 Computer Language Benchmarks Game 的 F# Threadring 条目中有什么作用?

转载 作者:行者123 更新时间:2023-12-04 01:54:45 25 4
gpt4 key购买 nike

计算机语言基准游戏的 F# entry for Threadring包含一条看似无用的行:if false then () .当我注释掉这一行时,程序运行得更快(对于 50000000 的输入,~2s vs ~55s)并产生相同的结果。这是如何运作的?为什么会有这条线?编译器究竟在做什么,似乎是一个无操作?

编码:

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

最佳答案

如果计算表达式包含 if false then ()然后异步工作流的转换方式有所不同。随着线路,它使用 async.Combine .稍微简化的代码如下所示:

async.Delay(fun () ->
value = cells.[i]
async.Combine
( async.Return(if false then ())
async.Delay(fun () ->
match value with (...) ) ))

翻译插入 Combine因为(可能)异步计算由 if 完成loop 需要结合下面的代码。现在,如果您删除 if你会得到类似的东西:
async.Delay(fun () ->
value = cells.[i]
match value with (...) ) ))

不同的是,现在在传递给 Delay 的函数中立即完成了更多的工作。 .

编辑:我认为这造成了差异,因为代码使用 Async.StartImmediate而不是 Async.Start ,但情况似乎并非如此。事实上,我根本不明白为什么代码使用异步工作流......

编辑二。 :我不完全确定 Mono,但它肯定会在 F# 交互中复制 - 在那里,带有 Combine 的版本大约慢 4 倍(这是我所期望的,因为函数分配开销)。

关于f# - "if false then ()"在 Computer Language Benchmarks Game 的 F# Threadring 条目中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13708969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com