Как опыт обучения, я недавно пытался реализовать Quicksort с 3-х сторонним разделением в C #.
Помимо необходимости добавить дополнительную проверку диапазона для левой / правой переменных перед рекурсивным вызовом, она, кажется, работает достаточно хорошо.
Я знал заранее, что фреймворк обеспечивает встроенную реализацию быстрой сортировки в List <>. Sort (через Array.Sort). Поэтому я попробовал базовое профилирование для сравнения производительности. Результаты: встроенный метод List <>. Sort, работающий с теми же списками, работает примерно в 10 раз быстрее, чем моя собственная реализация.
Используя отражатель, я обнаружил, что фактическая сортировка в List <>. Sort реализована во внешнем коде, а не в IL (в функции с именем tryszsort ()).
Глядя на мою собственную реализацию Quicksort, я ожидаю, что замена рекурсивных вызовов на итерацию может дать некоторое улучшение. Кроме того, отключение проверки границ массива (если возможно) также может дать некоторые преимущества. Может быть, это немного приблизит встроенную реализацию, но я не уверен.
Итак, мой вопрос: реалистично ли ожидать, что производительность оптимизированного алгоритма (написанного на .NET IL, сопоставленного с нативным кодом) может конкурировать с производительностью внешне реализованного алгоритма?
Еще раз, я понимаю, что Quicksort предоставляется как часть фреймворка, это был просто опыт обучения для меня. Однако есть также много алгоритмов (CRC32 приходит на ум), которые не предоставляются, но все же могут иметь большое значение для многих приложений. Вот связанный вопрос относительно реализации CRC32 в .NET и проблем с производительностью.
Итак, если вам нужно реализовать такой алгоритм в .NET, каковы основные соображения производительности, чтобы ваш алгоритм мог хотя бы приблизиться к производительности внешнего кода?
[Update]
Я увеличил скорость выполнения примерно до 10% от встроенного массива Array.Sort, изменив алгоритм для работы с простым массивом Int вместо List. В Reflector я вижу, что это позволяет избежать операции Callvirt () при каждом получении или установке в списке. Я думал, что это может улучшить положение вещей, но я удивлен тем, насколько.