मैं स्प्रिंटफ उपयोगों के प्रदर्शन की तुलना कर रहा था और मैंने जो देखा उससे थोड़ा परेशान था। मैंने निम्न 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()
के परिणाम के प्रकाश में सामान्य रूप से स्प्रिंटफ धीमी गति से धीमा प्रतीत होता है (और लाइव अनुप्रयोगों के प्रोफाइल में देखा गया है)। स्ट्रिंग की तुलना में स्प्रिंटफ की गति धीमी क्यों होती है। फोर्मेट()? क्या एफ # स्पेस में कोई बेहतर विकल्प है जिसे मैंने याद किया है?
चूंकि आप पहले ही जानते हैं कि यह प्रतिबिंब का उपयोग करता है, आप वास्तव में क्या देख रहे हैं? – Daniel
'StringBuilder.AppendFormat' के साथ [' printf' स्रोत] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/printf.fs) की तुलना करें। 'printf' बहुत कुछ करता है, उदाहरण के लिए, रिकर्सिव संग्रह मुद्रण। – Daniel
केवल% ए प्रतिबिंब का उपयोग करता है। % मैं आधार मामला होगा। – roken