2013-05-24 10 views
5

मैं स्प्रिंटफ उपयोगों के प्रदर्शन की तुलना कर रहा था और मैंने जो देखा उससे थोड़ा परेशान था। मैंने निम्न 4 विधियों का परीक्षण किया, प्रत्येक में क्लासविथ टॉस्ट्रिंग का एक उदाहरण पास किया (प्रिंटआईन्ट को छोड़कर, जिसे वास्तविक पूर्णांक मान प्राप्त हुआ)।स्प्रिंटफ बनाम स्ट्रिंग का प्रदर्शन। फोर्मेट

type ClassWithToString() = 
    member this.X = 42 
    override this.ToString() = this.X.ToString() 

let Print item : string = 
    sprintf "%A" item 

let PrintInt item: string = 
    sprintf "%i" item 

let PrintObj item: string = 
    sprintf "%O" item 

let Format item : string = 
    System.String.Format("{0}", item) 

50.000 पुनरावृत्तियों के लिए परिणाम:

Print (%A):  3143ms 
PrintInt (%i): 355ms 
PrintObj (%O): 384ms 
Format:   8ms 

के लिए "प्रिंट," मैं समझता हूँ% एक तो सुस्ती वहाँ चौंकाने वाला नहीं है, हालांकि 50 पुनरावृत्तियों के लिए मैं कुल में आश्चर्यचकित था प्रतिबिंब उपयोग कर रहा है पहर। उसके बाद, "प्रिंटइन्ट" और "प्रिंटओबीजे" प्रतिबिंब का उपयोग नहीं करते हैं और इस प्रकार तीव्रता का क्रम तेजी से होता है, जो भी समझ में आता है।

जो हिस्सा मुझे भ्रमित करता है वह यह है कि String.Format() के परिणाम के प्रकाश में सामान्य रूप से स्प्रिंटफ धीमी गति से धीमा प्रतीत होता है (और लाइव अनुप्रयोगों के प्रोफाइल में देखा गया है)। स्ट्रिंग की तुलना में स्प्रिंटफ की गति धीमी क्यों होती है। फोर्मेट()? क्या एफ # स्पेस में कोई बेहतर विकल्प है जिसे मैंने याद किया है?

+0

चूंकि आप पहले ही जानते हैं कि यह प्रतिबिंब का उपयोग करता है, आप वास्तव में क्या देख रहे हैं? – Daniel

+1

'StringBuilder.AppendFormat' के साथ [' printf' स्रोत] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/printf.fs) की तुलना करें। 'printf' बहुत कुछ करता है, उदाहरण के लिए, रिकर्सिव संग्रह मुद्रण। – Daniel

+1

केवल% ए प्रतिबिंब का उपयोग करता है। % मैं आधार मामला होगा। – roken

उत्तर

7

केवल% ए प्रतिबिंब का उपयोग करता है। % मैं आधार मामला होगा।

यह सच नहीं है। सभी printf फ़ंक्शंस को फ़ंक्शन स्ट्रिंग्स से टाइप-सेफ़ प्रिंटिंग फ़ंक्शंस बनाने के लिए प्रतिबिंब की आवश्यकता होती है, इससे कोई फर्क नहीं पड़ता कि आप किस विनिर्देशक का उपयोग करते हैं। अधिक जानकारी के लिए printf मॉड्यूल से this line और this line पर एक नज़र डालें। तो यह देखना आसान है कि क्यों sprintf "%i"String.Format से धीमा है। sprintf "%A" के मामले में, इसमें प्रतिबिंब का एक और स्तर है जो इसकी भयानक धीमी गति से बताता है।

क्या एफ # स्पेस में कोई बेहतर विकल्प है जिसे मैंने याद किया है?

उद्देश्य बड़ा श्रृंखला बनाते है, तो StringWriter और StringBuilder शायद जाने के लिए तरीके हैं। यदि आप लॉगिंग उद्देश्य के लिए बेंचमार्क करते हैं, तो FastPrintf एक आशाजनक लाइब्रेरी है। आप this NuGet package को आजमा सकते हैं जो अंतर्निहित printf फ़ंक्शंस से 100x तेज होने का दावा करता है।

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