当前位置:  开发笔记 > 编程语言 > 正文

F#:为什么使用外部函数版本比传递函数更快作为参数

如何解决《F#:为什么使用外部函数版本比传递函数更快作为参数》经验,为你挑选了0个好方法。

使用直接外部函数的版本(calc1)大约需要1秒.

但是带有传递函数作为函数参数的版本(calc2)大约需要2s,即慢2倍.为什么?

open System.Diagnostics
open System.Numerics

let width = 1920
let height = 1200
let xMin = -2.0
let xMax = 1.0
let yMin = -1.0
let yMax = 1.0
let scaleX x = float x * (xMax - xMin) / float width + xMin
let scaleY y = float y * (yMax - yMin) / float height - yMax

let fn (z:Complex) (c:Complex) = z * z + c

let calc1 width height =
    let iterFn z c =
        let rec iterFn' (z:Complex) c n =
            if z.Magnitude > 2.0 || n >= 255 then n
            else iterFn' (fn z c) c (n + 1)
        iterFn' z c 0

    Array.Parallel.init (width * height) (fun i ->
        let x, y = i % width, i / width
        let z, c = Complex.Zero, Complex(scaleX x, scaleY y)
        (x, y, iterFn z c)
    )

let calc2 width height fn =
    let iterFn z c =
        let rec iterFn' (z:Complex) c n =
            if z.Magnitude > 2.0 || n >= 255 then n
            else iterFn' (fn z c) c (n + 1)
        iterFn' z c 0

    Array.Parallel.init (width * height) (fun i ->
        let x, y = i % width, i / width
        let z, c = Complex.Zero, Complex(scaleX x, scaleY y)
        (x, y, iterFn z c)
    )

在F#interactive中执行获得以下结果:

> calc1 width height |> ignore
Real: 00:00:00.943, CPU: 00:00:03.046, GC gen0: 10, gen1: 8, gen2: 2
val it : unit = ()

> calc2 width height fn |> ignore
Real: 00:00:02.033, CPU: 00:00:07.484, GC gen0: 9, gen1: 8, gen2: 1
val it : unit = ()

F#4.0.1,.NET 4.6.1

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有