Я знаю, что .NET
это JIT
скомпилировано с архитектурой, на которой вы работаете непосредственно перед запуском приложения, но оптимизирует ли JIT-компилятор для 64-битной архитектуры?
Есть ли что-то, что нужно сделать или учесть при программировании приложения, которое будет работать на 64bit system
? (т.е. повысит ли производительность Int64 производительность и будет ли компилятор JIT автоматически работать с Int64 на 32-битных системах?)
64bit JIT отличается от того, для 32 - битной, так что я бы ожидать некоторые различия в выходе - но я бы не перейти на 64bit только для этого, и я не ожидал , чтобы получить большую скорость (если таковые имеются) в процессорное время путем переключения на 64 бит.
Вы заметите значительное улучшение производительности, если ваше приложение использует много памяти, а на ПК достаточно оперативной памяти, чтобы справиться с этим. Я обнаружил, что 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-компилятор ведет себя иначе, чем x86-компилятор. Компилятор x86 использует некоторые оптимизации, которых нет у x64.
Например, в .NET 3.5 32-битный JIT будет вызывать встроенные вызовы функций со структурами в качестве аргументов, а 64-битный JIT - нет.
В производственном коде я видел, что сборки x86 работают на 20% быстрее, чем сборки x64 (без других изменений)
Подводя итог, используйте 64-битные только если
- Вам нужна дополнительная память, и нет никакого способа обойти это.
- Вы программируете, например, научные приложения и нуждаетесь в повышенной математической точности
По всем остальным аспектам на сегодняшний день 64-битный компилятор в .NET находится на шаг ниже.
Оптимизация производительности, проводимая в компиляторах .NET, является большой проблемой.