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

X64 vs x86 Рекомендации по производительности .Net

Я пытаюсь понять, какие различия в производительности существуют при запуске собственного приложения С#/.NET 4.0 в x64 vs x86. Я понимаю соображения памяти (x64, обращаясь ко всей памяти, x86 ограничивается 2/4gb), а также тот факт, что x64-приложение будет использовать больше памяти (все указатели составляют 8 байт вместо 4 байтов). Насколько я могу судить, ни одно из них не должно влиять на какие-либо часы для инструкций часов, поскольку конвейер x64 достаточно широк, чтобы обрабатывать более широкие инструкции.

Есть ли успех при переключении контекста из-за большего размера стека для каждого потока? Какие соображения производительности мне не хватает при оценке двух?

4b9b3361

Ответ 1

Джо Уайт дал вам несколько веских причин, почему ваше приложение может быть медленнее. Более крупные указатели (и, следовательно, более крупные ссылки в .NET) занимают больше места в памяти, а это значит, что меньше кода и данных будет вписываться в кеш.

Однако есть много полезных причин, по которым вы можете использовать x64:

  • Соглашение о вызове AMD64 по умолчанию используется в x64 и может быть немного быстрее, чем стандартный cdecl или stdcall, причем многие аргументы передаются в регистры и используют регистры XMM для плавающей запятой.

  • CLR будет выдавать скалярные инструкции SSE для работы с операциями с плавающей запятой в 64-разрядной версии. В x86 он возвращается к использованию стандартного стека x87 FP, который довольно медленный, особенно для таких вещей, как преобразование между int и float.

  • Наличие большего количества регистров означает, что вероятность того, что JIT будет израсходована из-за давления в регистре, будет гораздо меньше. Регистры разливов могут быть довольно дорогостоящими для быстрых внутренних петель, особенно если функция встраивается и вводит дополнительное давление в регистре.

  • Любые операции с 64-битными целыми числами могут быть чрезвычайно полезны, если они могут вписаться в один регистр, а не разбиваться на две отдельные половины.

  • Это может быть очевидным, но дополнительная память, к которой может обращаться ваш процесс, может быть весьма полезна, если ваше приложение интенсивно использует память, даже если оно не достигает теоретического предела. Фрагментация может привести к тому, что вы ударите "из памяти" до тех пор, пока не достигнете этой отметки.

  • RIP-относительная адресация в x64 может в некоторых случаях уменьшить размер исполняемого изображения. Хотя это действительно не относится непосредственно к приложениям .NET, это может повлиять на совместное использование DLL, которые в противном случае могут быть перенесены. Мне было бы интересно узнать, имеет ли кто-нибудь конкретную информацию об этом в отношении .NET и управляемых приложений.

Кроме того, x64-версия среды выполнения .NET, по крайней мере, в текущих версиях, выполняет больше оптимизаций, чем эквивалент x86. Такие вещи, как inlining и выравнивание памяти, похоже, происходят гораздо чаще. Фактически, была некоторая ошибка, которая препятствовала встраиванию любого метода, который взял или вернул тип значения; Я помню, что он зафиксирован в x64, а не в версии x86.

Действительно, единственный способ узнать, что лучше для вашего приложения, - это выполнить профилирование и тестирование на обеих архитектурах и сравнить реальные результаты. Тем не менее, я лично просто использую любой CPU везде, где это возможно, и избегайте того, что по своей природе зависит от архитектуры. Это упрощает сборку и развертывание, и, мы надеемся, будет более перспективным доказательством, когда большинство пользователей начнут переходить на x64 исключительно.

Ответ 2

Близко к "x64 app будет использовать больше памяти" является тот факт, что с 64-битным приложением ваша локальность ссылок меньше (потому что все ваши размеры указателя удваиваются), поэтому вы получаете меньше пробега из Встроенный в процессор (сверхбыстрый) кэш. Вам приходится чаще извлекать данные из системной памяти, что намного медленнее, чем L2 и даже кеш-память L1.