.Net 3.5 Приложение Windows Forms: время загрузки x86 и x64 в 64-битной Vista

Мы разрабатываем приложение Winforms и оптимизируем время запуска.

Приложение работает на 64-битных машинах Vista. В нашем тестировании мы обнаружили противоречивый результат. При прочих равных, ориентация на 32-битные и 64-битные нагрузки вдвое меньше. Может ли кто-нибудь пролить свет на то, почему?

Спасибо.

[Редактировать] Мы развертываем приложение через ClickOnce, который, согласно нашим исследованиям, запускает приложения в уникальной песочнице. Поэтому он всегда запускается из холодного состояния, поэтому попытки улучшить производительность здесь были бесплодны.

Нашей основной проблемой было наличие в проекте 32-битных dll. Как только мы нацелили проект на x86 (хотя он работает на x64), время загрузки сократилось вдвое. [/Редактировать]

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 644
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

64-разрядная версия обычно использует вдвое больше памяти в куче: каждый указатель занимает в два раза больше места, а .NET полна указателей. Поскольку на запуск сильно влияет инициализация памяти, это может составлять часть дополнительных накладных расходов. См. Также Пламя Дональда Кнута о 64-битных указателях.

Обратите внимание, что, по словам Microsoft, .Net 3.5 SP1 включает значительную часть работы по повышению производительности при запуске (улучшение до 40% для некоторых приложений), так что вы можете увидеть, помогает ли это вообще.

Ответ принят как подходящий

.NET 3.5 SP1 получает улучшенную производительность при запуске, поскольку больше не проверяется строгое имя сборок, поступающих из надежных расположений. Немного спорным в моей книге, но несколько оправданно.

Я проверил, обходит ли 64-разрядная версия CLR этот трудоемкий этап. Подписал DLL, поместил в GAC, затем пропатчил байт. При загрузке сборки претензий нет. Таким образом, разница не объясняется улучшением параметров запуска SP1.

Другие факторы, влияющие на время запуска: - Загрузка CLR с диска (только холодный старт) - Расправы по зависимым узлам - JIT-компиляция кода запуска

Холодный старт вполне может быть фактором, у вас, вероятно, нет других запущенных процессов с загруженной 64-битной версией CLR. Легко устранить, запустив фиктивное приложение .NET во время тестирования.

По той же причине сборка может занять больше времени. Маловероятно, что 64-битные ngen-ed образы сборок .NET находятся в кеше файловой системы. Опять же, это легко устранить с помощью фиктивного приложения, зависящего от тех же сборок.

64-битный JITter - более крепкий орешек. Произвольный вызов состоит в том, чтобы предположить, что MSFT не потратил столько времени на выполнение этой задачи, сколько 32-битный JITter. Однако ничего не подтверждено никакими доказательствами. Трудно также измерить, вам нужно загрузить сборку с помощью Assembly.Load, а затем использовать Activator.CreateInstance (), когда конструктор класса вызывает как можно больше кода.

Другие вопросы по теме