2012-08-14 4 views
5

Ich habe das in der Array.Sort fand heraus,.NET 4.0 interne Implementierung von Art

[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail), SecurityCritical] 
[MethodImpl(MethodImplOptions.InternalCall)] 
private static extern bool TrySZSort(Array keys, Array items, int left, int right); 

aufgerufen wird. Irgendwelche Ideen, wie dies umgesetzt wird?

+0

Diese Methode ist in nativem Code implementiert, daher das Schlüsselwort "extern". Könnte irgendwo in der Referenzquelle enthalten sein, aber wenn Sie nicht nur neugierig darauf sind, wie es implementiert wird, ist es wahrscheinlich schneller als alles, was Sie in verwalteten Code schreiben können. –

+0

http://stackoverflow.com/questions/6842090/c-sharp-fastest-way-to-sort-an-array-in-descending-order – xandercoded

+0

Ich bin neugierig, weil naive QuickSort aufgerufen wird, wenn Standard-Comparer verwendet wird. Also bedeutet das Array.Sort garantiert nicht N * Log (N) schlimmsten Fall, auch wenn TrySZSort aufgerufen wird oder nicht. –

Antwort

3

Irgendwelche Ideen, wie dies umgesetzt wird?

Diese Methode ist in nativem Code implementiert, intern in der CLR selbst. Es gibt viele Methoden wie diese auf den sehr niedrigen Typen. Zum Beispiel sind einige der Methoden auf System.String markiert InternalCall und in der Common Language Runtime selbst implementiert.

+0

Ja, ich sehe, dass es in nativem Code implementiert ist. Aber welche Art von Sortierung verbirgt sich: schnell, Heap, Merge, Tim, etc? –

+2

@RomanDzhabarov QuickSort - Siehe: http://msdn.microsoft.com/en-us/library/kwx6zbd4.aspx "Diese Methode verwendet den QuickSort-Algorithmus." –

+1

Es ist in der Regel nicht nur schnelle Sortierung - unterhalb einer bestimmten Ebene wechselt es zum Einfügen sortieren. Auch wenn es zu viele Rekursionen macht, schaltet es auf Heap-Sortierung, glaube ich. Atlease Visual Studio C Laufzeitbibliothek Sortierung macht diese Dinge. – Fakrudeen

11

Sie können eine ziemlich zuverlässige Kopie des CLR-Quellcodes von SSCLI20 source distribution erhalten. Es wurde 2005 veröffentlicht und war zu der Zeit eine ziemlich genaue Kopie von CLR Version 2. Niemals eine offensichtliche Diskrepanz gefunden.

Das ist seit damals, bereits vor 7 Jahren, und seither ein ziemlich großes CLR-Versionsupdate. Aber TrySZSort() gibt es immer noch, diese Low-Level-Implementierungen sind sehr selbsterhaltend. Sie finden es in clr/src/vm/ecall.cpp erklärt und ArrayHelper abgebildet :: TrySZSort(), eine C++ Methode deklariert in clr/src/vm/arrayhelpers.cpp

Es ist sonst sehr langweilig, es ruft nur eine Vorlage Klassenmethode namens ArrayHelpers<T>.QuickSort(), spezialisiert von Array-Elementtyp für Werttyp Elemente.

Wie Tony Hoare es vor 52 Jahren geschrieben hat. Obwohl nicht in C++;)

Sie finden den Grund, warum dieser Code in C++ geschrieben ist und nicht in C# in this answer.

+0

Große Antwort, danke. Leider kann ich nicht mehrere als die besten festlegen. –

+0

Siehe Quellcode für ArrayHelper .QuickSort(): https://github.com/kasicass/sscli20/blob/dc64e12c9b835d4d373aa04978c0e8f1763b2e1b/clr/src/vm/comarrayhelpers.h#L77 –