यह एक Seq
मॉड्यूल के iter
और map
कार्यों बहुत धीमी Array
और List
मॉड्यूल समकक्ष की तुलना में किया जा रहा है के बारे में मेरे पिछले question अप करने के लिए का पालन करें।सीक मॉड्यूल में कुछ फ़ंक्शन क्यों अनुकूलित किए गए हैं जबकि अन्य F # में नहीं थे?
स्रोत को देखते हुए, मैं देख सकता हूँ कि कुछ कार्यों ऐसे isEmpty
और length
के रूप में एक बहुत ही सरल प्रकार की जांच करता है IEnumerator
का उपयोग कर का सहारा से पहले सरणियों और सूचियों के लिए अनुकूलन करने के लिए।
[<CompiledName("IsEmpty")>]
let isEmpty (source : seq<'T>) =
checkNonNull "source" source
match source with
| :? ('T[]) as a -> a.Length = 0
| :? list<'T> as a -> a.IsEmpty
| :? ICollection<'T> as a -> a.Count = 0
| _ ->
use ie = source.GetEnumerator()
not (ie.MoveNext())
[<CompiledName("Length")>]
let length (source : seq<'T>) =
checkNonNull "source" source
match source with
| :? ('T[]) as a -> a.Length
| :? ('T list) as a -> a.Length
| :? ICollection<'T> as a -> a.Count
| _ ->
use e = source.GetEnumerator()
let mutable state = 0
while e.MoveNext() do
state <- state + 1;
state
iter
एक ही दृष्टिकोण बेहद अपने प्रदर्शन में सुधार करने, जब मैं iter
समारोह में यह अंतर्निहित संस्करण पर महत्वपूर्ण लाभ प्रस्तुत shadowed किया जा सकता है के मामले में:
[<CompiledName("Iterate")>]
let iter f (source : seq<'T>) =
checkNonNull "source" source
use e = source.GetEnumerator()
while e.MoveNext() do
f e.Current;
मेरे सवाल यह है कि Seq
मॉड्यूल में कुछ कार्यों को विशिष्ट संग्रह प्रकारों (सरणी, सूची < टी> इत्यादि) के उपयोग के लिए अनुकूलित किया गया था। iter
और nth
जैसे अन्य फ़ंक्शन कैसे नहीं थे एक समान तरीके से समयबद्ध?
इसके अलावा, map
फ़ंक्शन के मामले में, @mausch ने बताया, क्या Enumerable.Select
(नीचे देखें) के समान दृष्टिकोण को नियोजित करना संभव नहीं है और विभिन्न संग्रह प्रकारों के लिए विशेष इटरेटर्स का निर्माण करना संभव नहीं है?
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
if (source == null)
throw Error.ArgumentNull("source");
if (selector == null)
throw Error.ArgumentNull("selector");
if (source is Enumerable.Iterator<TSource>)
return ((Enumerable.Iterator<TSource>) source).Select<TResult>(selector);
if (source is TSource[])
return (IEnumerable<TResult>) new Enumerable.WhereSelectArrayIterator<TSource, TResult>((TSource[]) source, (Func<TSource, bool>) null, selector);
if (source is List<TSource>)
return (IEnumerable<TResult>) new Enumerable.WhereSelectListIterator<TSource, TResult>((List<TSource>) source, (Func<TSource, bool>) null, selector);
else
return (IEnumerable<TResult>) new Enumerable.WhereSelectEnumerableIterator<TSource, TResult>(source, (Func<TSource, bool>) null, selector);
}
अग्रिम में बहुत धन्यवाद।
मुझे यकीन नहीं है कि आपको इस तरह के 'क्यों' प्रश्न का एक सभ्य उत्तर मिलेगा; मेरा सबसे अच्छा _guess_ बस डेवलपर समय की कमी है। – ildjarn