Подтвердить что ты не робот

Производительность приложения С#, построенного на платформе AnyCPU vs x64 на 64-битной машине

Мне нужно развернуть приложение С# на 64-битной машине, хотя есть небольшая вероятность того, что он также может быть развернут на 32-битной машине. Должен ли я создать два отдельных исполняемых файла с таргетингом на платформу x86 и x64, или я должен пойти на одну исполняемую встроенную платформу "AnyCPU" с таргетингом (указанную в опции "Свойство сборки проекта". Будет ли какая-либо разница в производительности между сборкой С# сборки с таргетингом "AnyCPU", развертывается на 64-битной машине против той же сборки, что и таргетинг специально для платформы x64?

4b9b3361

Ответ 1

Нет, нет никакой разницы в производительности между AnyCPU-приложением, работающим на 64-битной Windows, и запущенным на нем x64-приложением. Единственное, что изменяет флаг, это некоторые флаги в заголовке скомпилированной сборки, и CLR использует его только для того, чтобы решить, следует ли использовать x86 или x64, ничего больше

Если вы спрашивали, существует ли разница между приложением x86, запущенным на 64-разрядной Windows и x64 (или AnyCPU), тогда ответ будет да. Различия между ними:

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

Ответ 2

Как примечание к приведенному выше ответу. Могут возникнуть проблемы с использованием P/Invoke или DotNetInterop в x86 DLL на x64-ОС с использованием AnyCPU. В случае, когда 64-разрядная версия DLL не доступна, может потребоваться компиляция x86, а не AnyCPU, поскольку ОС попытается загрузить 64-разрядную версию... и завершится с ошибкой.