Безопасная производительность против небезопасной

Почему небезопасный код ниже по сравнению с безопасным доступом к массиву не намного быстрее? Что тормозит и идеи как это лучше написать? Я попытаюсь отредактировать Heapsort как небезопасный.

public unsafe static void HeapSortU(double[] array, int low, int high)
{
  int length = high - low + 1;
  fixed (double* arrPtr = array, start = &array[low], stred = &array[low + length / 2 - 1], root = &array[high])
  {
    for (double* i = stred; i >= start; i--)
      HeapifyU(start, root, i);
    for (double* i = root; i >= start; i--)
    {
      double temp = *start;
      *start = *i;
      *i = temp;
      HeapifyU(start, i, start);
    }
  }
}

private unsafe static void HeapifyU(double* start, double* root, double* bottom)
{
  double* l, largest;
  while (true)
  {
    largest = bottom;                    // initialize largest as root 
    l = bottom + (bottom - start) + 1;   // left = 2*bottom + 1 
    if (l < root && *l > *largest)
      largest = l;
    l++;                                 // right = 2*bottom + 2 
    if (l < root && *l > *largest)
      largest = l;
    if (largest != bottom)
    {
      double temp = *bottom;
      *bottom = *largest;
      *largest = temp;
      bottom = largest;
    }
    else
      break;
  }
}

(Я не знаю, что еще написать, но автоматическая проверка все равно сообщает: «Похоже, ваш пост — это в основном код; пожалуйста, добавьте еще немного деталей».)


person pokusek123atlascz    schedule 26.12.2019    source источник
comment
Возможный дубликат stackoverflow.com/questions/5374815/   -  person    schedule 26.12.2019
comment
Почему вы пытаетесь оптимизировать его? Вам просто любопытно, или производительность необходима? Но если бы мне пришлось угадывать, я бы сказал, что старый добрый GC'd C#, вероятно, намного быстрее и лучше оптимизирован, чем вы можете предположить.   -  person Slothario    schedule 26.12.2019
comment
Единственным преимуществом такого небезопасного кода является то, что он не будет выполнять никаких проверок индекса массива. На современных машинах, которые не так много покупают, доступ к памяти обходится во много раз дороже, чем чек. Особенно, если вы не обращаетесь к нему удобным для кеша способом или массив велик. Не забудьте сравнить с Array.Sort().   -  person Hans Passant    schedule 26.12.2019
comment
Отвечает ли это на ваш вопрос? Настоящая небезопасная производительность кода   -  person Julian    schedule 26.12.2019