Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#Interactive应该比编译的速度慢得多吗?_F# - Fatal编程技术网

F#Interactive应该比编译的速度慢得多吗?

F#Interactive应该比编译的速度慢得多吗?,f#,F#,我已经使用F#近六个月了,我非常确信F#Interactive应该具有与编译时相同的性能,以至于当我费心对其进行基准测试时,我确信这是某种编译器错误。虽然现在我想,我应该在打开一个问题之前先检查一下这里 对我来说,它大约慢了3倍,而优化开关似乎什么也没做 这应该是标准行为吗?如果是这样,我真的被时间指令迷住了。我有在这上面求和1亿个元素所需的时间 更新: 多亏了FuleSnabel,我发现了一些东西 我尝试从fsianycpu.exe(默认的F#Interactive)和fsi.exe运行示例脚

我已经使用F#近六个月了,我非常确信F#Interactive应该具有与编译时相同的性能,以至于当我费心对其进行基准测试时,我确信这是某种编译器错误。虽然现在我想,我应该在打开一个问题之前先检查一下这里

对我来说,它大约慢了3倍,而优化开关似乎什么也没做

这应该是标准行为吗?如果是这样,我真的被时间指令迷住了。我有在这上面求和1亿个元素所需的时间

更新:

多亏了FuleSnabel,我发现了一些东西

我尝试从
fsianycpu.exe
(默认的F#Interactive)和
fsi.exe
运行示例脚本,两次运行的时间不同。第一次为134ms,第二次为78ms。这两个计时也分别对应于未优化和优化二进制文件的计时

更让人困惑的是,我用来编译这个东西的第一个项目是我正在制作的游戏库(脚本形式)的一部分,它拒绝编译优化的二进制文件,而是在没有通知我的情况下切换到未优化的。我必须开始一个新的项目,以使其正确编译。奇怪的是另一个测试编译得很好


所以基本上,这里发生了一些奇怪的事情,我应该考虑将
fsianycpu.exe
切换为
fsi.exe
,作为默认解释器。

我在pastebin中尝试了示例代码,但没有看到您描述的行为。这是我的性能运行的结果:

.\bin\Release\ConsoleApplication3.exe
Total iterations: 300000000, Outer: 10000, Inner: 30000
reduce sequence of list, result 450015000, time 2836 ms
reduce array, result 450015000, time 594 ms
for loop array, result 450015000, time 180 ms
reduce list, result 450015000, time 593 ms
fsi -O --exec .\Interactive.fsx
Total iterations: 300000000, Outer: 10000, Inner: 30000
reduce sequence of list, result 450015000, time 2617 ms
reduce array, result 450015000, time 589 ms
for loop array, result 450015000, time 168 ms
reduce list, result 450015000, time 603 ms
预计Seq.reduce速度最慢,for循环速度最快,并且列表/数组上的reduce大致相似(这假设列表元素的局部性无法保证)

我重写了您的代码,以允许在内存不足的情况下进行更长时间的运行,并改进数据的缓存位置。在短期内,测量的不确定性使得比较数据变得困难

Program.fs:

module fs

let stopWatch = 
  let sw = new System.Diagnostics.Stopwatch()
  sw.Start ()
  sw

let total = 300000000
let outer = 10000
let inner = total / outer

let timeIt (name : string) (a : unit -> 'T) : unit =
  let t = stopWatch.ElapsedMilliseconds
  let v = a ()
  for i = 2 to outer do
    a () |> ignore
  let d = stopWatch.ElapsedMilliseconds - t
  printfn "%s, result %A, time %d ms" name v d

[<EntryPoint>]
let sumTest(args) = 
  let numsList = [1..inner]
  let numsArray = [|1..inner|]

  printfn "Total iterations: %d, Outer: %d, Inner: %d" total outer inner

  let sumsSeqReduce () = Seq.reduce (+) numsList
  timeIt "reduce sequence of list" sumsSeqReduce

  let sumsArray () = Array.reduce (+) numsArray
  timeIt "reduce array" sumsArray

  let sumsLoop () =
    let mutable total = 0
    for i in 0 .. inner - 1 do
      total <- total + numsArray.[i]
    total

  timeIt "for loop array" sumsLoop

  let sumsListReduce () = List.reduce (+) numsList

  timeIt "reduce list" sumsListReduce

  0

另外,我使用Visual Studio 2015在Windows上运行。32位或64位似乎只起到了很小的作用

我想没有人能告诉你比Reddit更多的东西了-你为什么不等你的github票呢?我这边正在发生一些奇怪的事情。请参阅我的评论的更新。删除
-O
开关是否会使性能有所不同?对我来说不是。
#load "Program.fs"
fs.sumTest [||]