Обнаружил следующую непонятную вещь...

Сначала введение

Пару лет назад я озаботился сравнением скорости работы разных процессоров. Хотелось узнать какой процессор быстрее. Я написал простенькую програмку, которая O(N^2) способом сортирует массив из 65535 целых чисел и замеряет время. Какой процессор быстрее эту програмку выполнит, тот и лучше. Написал я её на C#.## Код:
```
private void Safe ()
         {
            const int n = 65535;
            int[] a = new int[n];
            int i, j;
            i = 0;
            while (i < n)
            {
               a[i++] = i * 1524231 + 27736188;
            }
            i = 0;
            while (i < n)
            {
               j = 0;
               while (j < n)
               {
                  if (a[j] < a[i])
                  {
                     int t = a[i];
                     a[i] = a[j];
                     a[j] = t;
                  }
                  j++;
               }
               i++;
            }
         }
```
Однако, так как Mono заметно уступает Microsoft.Net, то когда я запускал эту програмку на компьютерах с линуксом, то их производительность оказывалась чуть хуже, чем могла бы быть если бы Mono не уступала Microsoft.Net. Тогда я написал эту же самую сортировку в unsafe кодах, то есть не через индексы массива, а через указатели. Фактически на Си-подмножестве языка C#.
## Код:
```
private unsafe void Unsafe ()
         {
            const int n = 65535;
            int* a = stackalloc int[n];
            int* e = a + n;
            int* p, q;
            int i = 0;
            while (i < n)
            {
               a[i++] = i * 1524231 + 27736188;
            }
            p = a;
            while (p < e)
            {
               q = a;
               while (q < e)
               {
                  if (*q < *p)
                  {
                     int t = *p;
                     *p = *q;
                     *q = t;
                  }
                  q++;
               }
               p++;
            }
         }
```
Скорость работы unsafe программы в большей степени зависела от качества процессора чем от качества дотнета. Я не ставил своей целью сравнивать safe и unsafe код по быстродействию, я мерил разные процессоры. Совершенно очевидно было что unsafe код всегда выполнится быстрее чем safe код. Например, на Core i7 860 если производительность по unsafe коду принять за единичку, то производительность по safe коду совершенно естественно окажется меньше - 0.89. На Athlon 64 X2 4200+ практически тоже самое. При unsafe=1 для safe получаем 0.88.

А теперь необъяснимые чудеса...

На процессоре Core i5 2300 под 64 разрядной Windows 7 (дотнет 4.0) если производительность по unsafe коду принять за единичку, то производительность по safe коду чудесным образом окажется не меньше, а больше - 1.22.

Почему на этом компьютере сэйфный код выполняется на 22% быстрее ансэйфного аналога?..

-------------------------------------------------------
Доп. инфо.: программа скомпилирована под дотнет 3.5.