2012-03-16 13 views
7

निम्नलिखित कोड: जब मैंहास्केल: विभिन्न फ़ंक्शन संरचना से प्रदर्शन में अंतर?

average = fst . foldl' updateAverage (0.0, 0.0) -- version II 

साथ average समारोह की परिभाषा क्या इस का कारण यह हो सकता है की जगह:

import Control.Exception 
import Data.List 

updateAverage :: (Fractional t) => (t, t) -> t -> (t, t) 
updateAverage (old_value, old_counter) x = 
    let new_counter = old_counter + 1 
    in 
     assert(new_counter /= 0) 
     old_value `seq` (old_value + (x - old_value)/new_counter, new_counter) 

average values = fst (foldl' updateAverage (0.0, 0.0) values) -- version I 

main = do 
    let v = [1 .. 1000000] 
    let a = average v 
    putStrLn (show a) 

तेजी (ghc.exe -O3 संकलन विकल्प) हो जाता है? मैंने सोचा कि इन दो लाइनों के बीच अंतर मूल रूप से वाक्यविन्यास हैं। क्या दूसरा संस्करण (फ्री वैरिएबल values के बिना) संकलक को अनुकूलित करने के लिए आसान है?

अनुकूलन के बिना संकलित होने पर, पर्याप्त रूप से पर्याप्त, संस्करण मैं तेज़ी से हो जाता हूं।

समय परिणाम:

विकल्प: -O3

संस्करण मैं: 0.280s संस्करण द्वितीय: 0.212s

विकल्प: (कोई अनुकूलन)

संस्करण मैं: 0.42s संस्करण II: 0.44s

सिगविन में time शेल कमांड का उपयोग करके मापा गया।

प्रकार के साथ समय परिणाम = डबल:

डबल:

विकल्प: -O3

संस्करण मैं: 0.22s संस्करण द्वितीय :: 0.212s

विकल्प: (कोई अनुकूलन नहीं)

संस्करण I: 0.34s संस्करण I मैं: 0.35s

और जानकारी: मैं संकलक

> $ ghc -v Glasgow Haskell Compiler, Version 7.0.4, for Haskell 98, 
> stage 2 booted by GHC version 6.12.2 Using binary package database: 
> C:\Program Files\Haskell 
> Platform\2011.4.0.0\lib\package.conf.d\package.cache wired-in package 
> ghc-prim mapped to ghc-prim-0.2.0.0-e1f7c380581d61d42b0360d440cc35ed 
> wired-in package integer-gmp mapped to 
> integer-gmp-0.2.0.3-91607778cf3ae8f3948a50062b4f8479 wired-in package 
> base mapped to base-4.3.1.0-f520cd232cc386346843c4a12b63f44b wired-in 
> package rts mapped to builtin_rts wired-in package template-haskell 
> mapped to template-haskell-2.5.0.0-7d9b1443ac5ab69e5ed705a487990deb 
> wired-in package dph-seq not found. wired-in package dph-par not 
> found. Hsc static flags: -static 
> *** Deleting temp files: Deleting: 
> *** Deleting temp dirs: Deleting: ghc.exe: no input files Usage: For basic information, try the `--help' option. 
under Cygwin.* 
+0

मैं सराहना करता हूं कि डाउनवॉटर ने टिप्पणियों को समझाया कि वे इस प्रश्न में क्या पसंद नहीं करते हैं। –

+2

+1 बल के संतुलन को बहाल करने के लिए – Landei

+0

क्या आप दो संस्करणों और ओ के विभिन्न स्तरों के बीच गति में अंतर दिखा सकते हैं? आपने इसे कैसे माप लिया? – Sarah

उत्तर

3

मैं अनुमान है कि कुछ धारा संलयन या पाश संलयन के साथ चल रहा है हो सकता है का उपयोग कर रहा हूँ। शायद प्रीलूड में गहरा दफनाया गया एक पुनर्लेखन नियम है जो एक मामले में फायरिंग कर रहा है या दूसरे में नहीं। या, क्योंकि आप नहीं कहते हैं कि तेज़ी से, आप केवल कैश प्रभाव देख सकते हैं।

आप और अधिक जानना मछली सीखना चाहते हैं:

  • उपयोग ghc -ddump-simpl कोड है कि वास्तव में उत्पन्न किया जा रहा देख सकते हैं और यह तुलना करने के लिए।

  • निष्पादित किए जा रहे निर्देशों की संख्या की गणना करने के लिए valgrind का उपयोग करें।

यदि कुछ और नहीं है, तो ये टूल आपको पर्याप्त जानकारी देंगे जो आप अधिक केंद्रित, विस्तृत प्रश्न पूछ सकते हैं।

+0

धन्यवाद! संस्करण II कम प्रकार के रूपांतरण करता है। क्या मनोबल है कि पॉइंट-फ्री सिंटैक्स हास्केल को ऑप्टिमाइज़ करने के लिए आसान बनाता है कि यह प्रकारों के बीच मूल्यों को कैसे परिवर्तित करता है? –

+0

@quant_dev ऐसा संभव हो सकता है। – fuz

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