2011-05-28 40 views
6

Oye, he estado intentando encontrar una respuesta (tanto en stackoverflow como en google) a la pregunta de cómo Array.Sort en C# es tan rápido. No encontré ninguno.¿Cómo es Array.Sort en C# tan súper rápido?

No importa qué algoritmo utilicé No logré ordenar arreglos grandes más rápido que este. Sé que utiliza la clasificación rápida, pero debe estar muy optimizado.

¿Alguien sabe cómo lo hicieron tan rápido?

Respuesta

6

Puede usar ILSpy para desmontar el código. Esperaría que los métodos nativos en el código de clasificación interno aceleren las cosas.

+1

Gracias, intentaré eso. –

+5

Hm, extraño. Cada vez que algo es rápido en el CLR, la gente asume el código nativo ... –

+0

@Paul entonces mi suposición es incorrecta aquí? –

14

Es un código estándar de quicksort, escrito en C#. Puede encontrarlo en ArraySortHelper <> .QuickSort con, por ejemplo, Reflector.

Un error estándar bastante cuando el código de perfiles es hacerlo con el optimizador JIT deshabilitado. Lo cual sucederá cuando ejecute la compilación Debug o tenga un depurador adjunto. Esto no sucederá cuando usted perfile el método Array.Sort(), fue pre-jitted por ngen.exe cuando se instaló .NET en su máquina. El optimizador tiene un gran efecto en la calidad del código máquina generado. Compruebe this answer para el tipo de optimizaciones que realiza.

Puede depurar código de máquina de calidad de liberación, pero eso requiere cambiar una opción. Primero cambie a la configuración Release. Luego Herramientas + Opciones, Depuración, General, desmarque "Suprimir optimización de JIT en la carga del módulo". Tenga cuidado con las trampas, verá los efectos de la creación de líneas, el levantamiento de códigos y la eliminación de variables locales.

+0

¡Eso explica mucho, gracias! Tendré que volver a intentarlo con la optimización habilitada. –

Cuestiones relacionadas