2011-03-17 26 views
17

FSharp.Core और PowerPack में स्रोत को देखते हुए, मुझे लगता है कि दो या अधिक पैरामीटर वाले फ़ंक्शन को स्वीकार करने वाले बहुत से उच्च-ऑर्डर फ़ंक्शन FSharpFunc.Adapt का उपयोग करते हैं। उदाहरण के लिए:हमें FSharpFunc.Adapt का उपयोग कब करना चाहिए?

let mapi f (arr: ResizeArray<_>) = 
    let f = FSharpFunc<_,_,_>.Adapt(f) 
    let len = length arr 
    let res = new ResizeArray<_>(len) 
    for i = 0 to len - 1 do 
     res.Add(f.Invoke(i, arr.[i])) 
    res 

FSharpFunc.Adapt पर प्रलेखन काफी पतला है। क्या यह एक सामान्य सर्वोत्तम अभ्यास है जिसे किसी भी समय हमारे पास समान हस्ताक्षर के साथ उच्च-आदेश फ़ंक्शन का उपयोग करना चाहिए? केवल अगर पास-इन फ़ंक्शन को कई बार कहा जाता है? यह कितना अनुकूलन है? क्या हम Adapt का उपयोग हर जगह कर सकते हैं, या केवल शायद ही कभी?

आपके समय के लिए धन्यवाद।

उत्तर

13

यह काफी रोचक है! मेरे पास कोई आधिकारिक जानकारी नहीं है (और मैंने इसे कहीं भी दस्तावेज नहीं देखा), लेकिन यहां कुछ विचार हैं कि Adapt फ़ंक्शन कैसे काम कर सकता है।

mapi जैसे फ़ंक्शंस फ़ंक्शन का करीबी रूप लेते हैं, जिसका अर्थ है कि तर्क का प्रकार FSharpFunc<int, FSharpFunc<T, R>> जैसे कुछ के लिए संकलित किया गया है। हालांकि, कई कार्यों को वास्तव में दो तर्कों के कार्यों के रूप में सीधे संकलित किया जाता है, इसलिए वास्तविक मान आमतौर पर FSharpFunc<int, T, R> होगा जो FSharpFunc<int, FSharpFunc<T, R>> से प्राप्त होता है।

FSharpFunc<int, string>.InvokeFast<a>(f, 1, "a"); 

आप परावर्तक का उपयोग कर InvokeFast समारोह को देखें, तो आप देखेंगे कि यह परीक्षण करता है, तो समारोह संकलित किया गया है:

, तो आप इस फ़ंक्शन को कॉल करें (जैसे f 1 "a") एफ # संकलक कुछ इस तरह उत्पन्न करता है अनुकूलित संस्करण के रूप में (f :? FSharpFunc<int, T, R>)। यदि हां, तो यह सीधे Invoke(1, "a") पर कॉल करता है और यदि नहीं, तो उसे दो कॉल Invoke(1).Invoke("a") बनाने की आवश्यकता है।

यह चेक हर बार किया जाता है जब आप एक तर्क के रूप में पारित फ़ंक्शन को कॉल करते हैं (यह चेक करने के लिए शायद तेज़ है और फिर अनुकूलित कॉल का उपयोग करें, क्योंकि यह अधिक आम है)।

क्या Adapt समारोह करता है कि यह FSharpFunc<T1, T2, R> के लिए किसी भी समारोह में कनवर्ट करता है (यदि समारोह अनुकूल नहीं है, यह इसके लिए एक आवरण बनाता है, लेकिन यह मामला समय के सबसे अधिक नहीं है) है। अनुकूलित फ़ंक्शन पर कॉल तेज हो जाएंगे, क्योंकि उन्हें हर बार गतिशील जांच करने की आवश्यकता नहीं होती है (चेक केवल Adapt के अंदर किया जाता है)।

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

(बीटीडब्ल्यू: एक बहुत ही रोचक सवाल के लिए धन्यवाद, मुझे नहीं पता था कि संकलक यह करता है :-))

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

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