यह काफी रोचक है! मेरे पास कोई आधिकारिक जानकारी नहीं है (और मैंने इसे कहीं भी दस्तावेज नहीं देखा), लेकिन यहां कुछ विचार हैं कि 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 से अधिक तर्कों को बड़ी संख्या में लेता है। किसी भी अनुकूलन के साथ, मैं इसका उपयोग अंधेरे से नहीं करूँगा, लेकिन प्रदर्शन को ट्यून करने के बारे में जागरूक होना एक दिलचस्प बात है!
(बीटीडब्ल्यू: एक बहुत ही रोचक सवाल के लिए धन्यवाद, मुझे नहीं पता था कि संकलक यह करता है :-))