2016-01-10 28 views
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

उत्तर

1

मुझे लगता है कि पहले मामले में, fn inlined है।

एक पैरामीटर के रूप में यह पासिंग घटित से इस अनुकूलन को रोकता है, तो यह धीमी

+0

जॉन पामर की प्रतिक्रिया को जोड़ने के लिए, आप आसानी से 'fn' की परिभाषा के' inline' संशोधक जोड़कर परिकल्पना का परीक्षण कर सकता है। अगर वह समस्या थी, तो मंदी गायब होनी चाहिए। – piaste

+0

@piaste बनाओ 'एफएन' इनलाइन प्रदर्शन को प्रभावित नहीं करता है। लेकिन प्रदर्शन में वृद्धि अगर 'calc2' इनलाइन भी बनाते हैं। – anpv

+0

@piaste - यह नहीं है कि इनलाइन कैसे काम करता है। –

संबंधित मुद्दे