2016-10-12 6 views
2

В соответствии с this QA не должно быть разницы в производительности между приложением, построенным с использованием любого процессора и x64 при работе на 64-битной машине, однако я наблюдаю за двойным увеличением в моем случае использования, когда я специально построил платформу x64.Разница в производительности между AnyCPU и платформой x64 на 64-битной машине

Мое использование предназначено для обработки 64-битного bitboards, причем большая часть обработки выполняется на бит-операциях и арифметике на ulong переменных.

В качестве примера:

public static ulong ReverseBits(ulong x) 
{ 
    ulong t; 
    x = (x << 32) | (x >> 32); // Swap register halves. 
    x = (x & 0x0001FFFF0001FFFFUL) << 15 | // Rotate left 
     (x & 0xFFFE0000FFFE0000UL) >> 17; // 15. 
    t = (x^(x >> 10)) & 0x003F801F003F801FUL; 
    x = (t | (t << 10))^x; 
    t = (x^(x >> 4)) & 0x0E0384210E038421UL; 
    x = (t | (t << 4))^x; 
    t = (x^(x >> 2)) & 0x2248884222488842UL; 
    x = (t | (t << 2))^x; 
    return x; 
} 

static void Main(string[] args) 
{ 
    ulong sum = 0; 
    var s = Stopwatch.StartNew(); 
    for (ulong i = 0; i < 1000000000; i++) 
    { 
     sum += ReverseBits(i); 
    } 
    s.Stop(); 

    Console.WriteLine("Sum = {0}, took {1}ms", sum, s.ElapsedMilliseconds); 
    Console.ReadLine(); 
} 

В версии построения с любой платформой CPU результатов: Sum = 9745675244420464640, took 13148ms

В версии строить с платформой x64 результатов: Sum = 9745675244420464640, took 5693ms

Это больше, чем двойной прирост производительности. Почему существует такая большая разница, если общее предположение заключается в том, что любой процессор против сборки x64 должен выполнять то же самое на 64-битной машине?

+0

это то, что с кодом optmize или без него? – Franck

+2

Я предлагаю вам распечатать 'Environment.Is64BitProcess', чтобы проверить, что он * действительно работает с 64-битным кодом ... –

+0

@JonSkeet вы ударите ноготь по голове. Любой процессор имеет 32-битный код. Я был под впечатлением. Любой процессор всегда будет запускать 64-битный при исполнении на 64-битной машине. Есть ли способ заставить это, или это x64 путь? – Beyers

ответ

6

Нет, вы сравнили perf между 32-битным и 64-битным кодом. X64-вкус намного быстрее, потому что он может выполнять математику с одним 64-битным регистром процессора. Это гораздо больше похоже на 32-битный машинный код, он должен жонглировать двумя 32-разрядными регистрами. Легко увидеть разницу между ними с помощью Debug> Windows> Disassembly.

Это пошло не так, потому что вы уделяли слишком много внимания имени платформы решений. Слишком заметное отображение, но выбор, который имеет значение только для проектов на C++. И, к сожалению, в проектах UWP из-за .NET Native. Он выбирает инструменты для сборки, C# имеет только один компилятор, который может ориентироваться на любую платформу.

real Настройки, которые имеют значение, являются параметрами форсирования дрожания. Проект> Свойства> вкладка «Сборка». В случае необходимости выберите сборку выпуска и выберите пункт Платформа и «Предпочитайте 32-разрядные» настройки. Отвяжите последнее. Теперь вы увидите, что AnyCPU == x64 в 64-разрядной операционной системе.

 Смежные вопросы

  • Нет связанных вопросов^_^