2012-08-14 11 views
5

he descubierto que dentro de la Array.Sort,.NET 4.0 aplicación interna de tipo

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

es llamado. ¿Alguna idea de cómo se implementa esto?

+0

Ese método se implementa en código nativo, de ahí la palabra clave 'extern'. Podría incluirse en la fuente de referencia en alguna parte, pero a menos que sienta curiosidad por ver cómo se implementa, probablemente sea más rápido que cualquier cosa que pueda escribir en el código administrado. –

+0

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

+0

Tengo curiosidad porque se llama QuickSort ingenuo a menos que se use Comparer predeterminado. Entonces, eso significa Array.Sort no garantiza el peor caso de N * Log (N) incluso si se llama TrySZSort o no. –

Respuesta

3

¿Alguna idea de cómo se implementa esto?

Ese método se implementa en código nativo, interno dentro de la propia CLR. Hay muchos métodos como este en el núcleo mismo, tipos de bajo nivel. Por ejemplo, bastantes de los métodos en System.String están marcados con InternalCall y se implementan en el tiempo de ejecución de lenguaje común.

+0

Sí, veo que está implementado en código nativo. Pero, ¿qué clase de tipo esconde: rápido, montón, fusión, tim, etc.? –

+2

@RomanDzhabarov QuickSort - Ver: http://msdn.microsoft.com/en-us/library/kwx6zbd4.aspx "Este método usa el algoritmo QuickSort". –

+1

Por lo general, no es solo una ordenación rápida: por debajo de cierto nivel, cambia al tipo de inserción. Además, si hace demasiadas recursiones, cambia a una clasificación de montón, creo. La clase de biblioteca de tiempo de ejecución de Atlease Visual Studio C hace estas cosas. – Fakrudeen

11

Puede obtener una copia bastante confiable del código fuente CLR del SSCLI20 source distribution. Fue publicado en 2005 y, en ese momento, era una copia bastante precisa de la versión 2 de CLR. Nunca se encontró una discrepancia obvia.

Eso se ha movido desde entonces, hace ya 7 años y una actualización bastante importante de la versión de CLR desde entonces. Pero TrySZSort() todavía está presente, esas implementaciones de bajo nivel son altamente autoprotegidas. Usted encontrará que es declarada en CLR/src/vm/ecall.cpp y se asigna a ArrayHelper :: TrySZSort(), un método C++ declarada en CLR/src/vm/arrayhelpers.cpp

Es lo contrario muy aburrido, simplemente llama a un método de clase de plantilla llamado ArrayHelpers<T>.QuickSort(), especializado por tipo de elemento de matriz para elementos de tipo de valor.

Cual es la forma en que Tony Hoare lo escribió hace 52 años. Aunque no en C++;)

Encontrará el motivo por el que este código está escrito en C++ y no en C# en this answer.

+0

Excelente respuesta, gracias. Desafortunadamente no puedo establecer varios como el mejor. –

+0

Ver el código fuente para ArrayHelpers .QuickSort(): https://github.com/kasicass/sscli20/blob/dc64e12c9b835d4d373aa04978c0e8f1763b2e1b/clr/src/vm/comarrayhelpers.h#L77 –