Настройка производительности 64-битной .NET

Я знаю, что .NET он JIT скомпилирован для архитектуры, на которой вы работаете, непосредственно перед запуском приложения, но оптимизирован ли компилятор JIT для 64-битной архитектуры?

Есть ли что-то, что нужно сделать или учесть при программировании приложения, которое будет работать на a 64bit system ? (т.е. будет ли использование Int64 улучшать производительность и будет ли JIT-компилятор автоматически заставлять Int64 работать в 32-битных системах?)

Ответов (5)

Решение

64bit JIT отличается от того, для 32 - битной, так что я бы ожидать некоторые различия в выходе - но я бы не перейти на 64bit только для этого, и я не ожидал , чтобы получить большую скорость (если таковые имеются) в процессорное время перейдя на 64bit.

Вы заметите значительное улучшение производительности, если ваше приложение использует много памяти, а на ПК достаточно оперативной памяти, чтобы не отставать от него. Я обнаружил, что 32-битные .NET-приложения, как правило, начинают выбрасывать исключения из памяти, когда вы используете около 1,6 ГБ, но они начинают перегружать диск из-за разбиения на страницы задолго до этого - так что вы перестаете быть привязанными к вводу-выводу .

В принципе, если у вас узким местом является процессор, то 64-битная версия вряд ли поможет. Если ваше узкое место - это память, вы должны увидеть большое улучшение.

Будет ли использование Int64 улучшать производительность, и будет ли JIT-компилятор автоматически заставит Int64 работать в 32-битных системах

Int64 уже работает как в 32-битных, так и в 64-битных системах, но он будет быстрее работать на 64-битных системах. Так что, если вы в основном работаете с числами с Int64, работа в 64-битной системе должна помочь.

Самое главное - измерить свою производительность.

Узкие места в производительности будут одинаковыми независимо от того, 32- или 64-разрядная архитектура. Проблемы с производительностью, как правило, являются результатом неоптимальных алгоритмов - выбор между 32- и 64-разрядными типами не оказывает существенного влияния на производительность.

Самое главное, не пытайтесь улучшить производительность чего-либо до того, как вы это измерили. В частности, вы должны профилировать код, чтобы определить, где находятся ваши узкие места в производительности.

Это хорошая статья на эту тему, написанная одним из людей, которые работали над 64-битной JIT. В принципе, если вам абсолютно не нужно адресное пространство, которое может предложить 64-битное, или если вам не нужно выполнять 64-битные математические вычисления, вы, скорее всего, потеряете производительность. Например, чем больше указатели, тем меньше размер кеша.

Я заметил, что 64-битная версия работает намного медленнее.

Как было сказано, поведение 64-битного JIT-компилятора отличается от JIT-компилятора x86. Компилятор x86 воспользуется преимуществами некоторых оптимизаций, которых нет в компиляторе x64.

Например, в .NET 3.5 32-разрядный JIT будет встроить вызовы функций со структурами в качестве аргументов, а 64-разрядный JIT - нет.

В производственном коде я видел, что сборки x86 работают на 20% быстрее, чем сборки x64 (без других изменений).

Подводя итог, используйте 64-битную версию, только если

  1. Вам нужна дополнительная память, и ее нет.
  2. Вы программируете, например, научные приложения, и вам нужна повышенная математическая точность.

По всем остальным аспектам на сегодняшний день 64-битный компилятор в .NET находится на ступень ниже.

Оптимизация производительности, выполненная в компиляторах .NET, является большой проблемой.