5
संस्करण (calc1) प्रत्यक्ष बाहरी फ़ंक्शन का उपयोग करके लगभग 1s लेता है।एफ #: बाहरी समारोह समारोह का उपयोग कर बाहरी फ़ंक्शन संस्करण का उपयोग क्यों करें
लेकिन फ़ंक्शन के पैरामीटर के रूप में पास फ़ंक्शन के साथ संस्करण (कैल्क 2) लगभग 2 एस लेता है, जो 2x धीमा है। क्यूं कर?
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)
)
एफ # इंटरैक्टिव निम्नलिखित परिणाम प्राप्त में निष्पादित करें:
> 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 =()
एफ # 4.0.1, .NET 4.6.1
जॉन पामर की प्रतिक्रिया को जोड़ने के लिए, आप आसानी से 'fn' की परिभाषा के' inline' संशोधक जोड़कर परिकल्पना का परीक्षण कर सकता है। अगर वह समस्या थी, तो मंदी गायब होनी चाहिए। – piaste
@piaste बनाओ 'एफएन' इनलाइन प्रदर्शन को प्रभावित नहीं करता है। लेकिन प्रदर्शन में वृद्धि अगर 'calc2' इनलाइन भी बनाते हैं। – anpv
@piaste - यह नहीं है कि इनलाइन कैसे काम करता है। –