2014-09-08 1 views
0

У команды возникла интересная проблема, которую мы не можем объяснить. Один из наших пользователей пожаловался, что запуск кода на его машине был медленным. Мы исследуем этот вопрос и смогли воспроизвести проблему на виртуальной машине.Оптимизации отключили улучшенную производительность?

Просто примечание здесь: код разделен на разные сборки. Основное приложение - EXE, а остальная часть программы - в сборных DLL, которые являются их собственными проектами.

Сначала мы протестировали базу данных. Иногда производственная база данных может быть медленнее, чем база данных dev из-за нагрузки. Это не имело заметной разницы. В обоих случаях запуск кода требуется около 15 секунд. SLOW AS ....! Файл конструктора имеет 4400 строк кода.

Мы попробовали ngen, gac и ряд других попыток объяснить медленность, но ничего не получилось.

После ряда различных тестов наш ведущий разработчик, наконец, нашел проблему. Когда мы развернули версию Release на VM, она была SLOW (15 секунд для загрузки формы). Когда мы развернули версию DEBUG на VM, она была FAST (до 5 секунд для загрузки формы). После дальнейшего исследования мы обнаружили, что когда мы отключили оптимизацию (дважды щелкните Мой проект в папке проекта vb.net, выберите «Скомпилировать», а затем «Параметры расширенной компиляции», снимите отметку «Включить оптимизацию»), код был быстрее, чем когда оптимизация была включена , Мы подтвердили, что замедление кода происходит во всех случаях во время события IntializeComponent.

Однако ... просто чтобы выбросить большую морщинку. У нас есть профилировщик ANTS, установленный на наших dev-машинах, и когда мы просматриваем код за 3,1 секунды с отключением оптимизации.

Добавить еще одну морщину ... когда в отладчике запускается код InitializeComponent, при этом оптимизация включена в код, выполняемый в 891 мс. Точный же код с оптимизацией включается за пределами визуальной студии на SAME машине разработки код работает в 11 796ms.

Во второй раз тот же код выполняется, не выключая приложения, код работает одинаково быстро с оптимизацией или выключить результаты являются суб 100мс для обоих (отладочный/вне визуальной студии)

Все операционные системы работают под управлением Windows 7 (x64), а база кода скомпилирована для AnyCPU, и все тестовые машины имеют установленную инфраструктуру 4.5 (такие же, как dev-машины), но проекты построены на основе фреймворка 4.0 (для целей совместимости с XP).

Если кто-то там был опыт с чем-то вроде этого, то мы были бы признательны. Очевидно, мы сбиты с толку и более чем немного озадачены этим. Есть люди, которые утверждают, что их код выпуска работает медленнее, чем их код отладки в Интернете, но большинство ответов находятся в духе «Thats odd», но никто, кажется, не знает. Наше мнение манжеты заключается в том, что это как-то связано с платформой .NET.

+0

Можете ли вы предоставить [минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve)? –

+0

Вы посмотрели отчет об ошибке в Microsoft Connect? Я думаю, что на данный момент проблема проверена. Если вы настаиваете, я могу, возможно, объединить что-то вместе, но проблема возникает в проприетарном исходном коде, который я не могу освободить. Также обратите внимание, что он ТОЛЬКО встречается в 64-битных компиляциях, запущенных в Windows 7 с установленным фреймворком 4.5.1. Если это произойдет в Vista, я бы не знал. – Wizengamot

ответ

0

Основываясь на том, что мы нашли на сегодняшний день, похоже, проблема. JIT .NET-кода в InitializeComponent - это то, что занимает время. Мы сделали кучу профилирования «старой школы», и мы подтвердили, что задержка происходит до того, как событие InitializeComponent даже называется. Как только код действительно попадает в подпрограмму, он запускается всего за секунду или два (что мы считаем нормальным для такой сложной формы).

Оказалось, что проблема была сообщена Microsoft, но на это не так много видимости, поэтому, если вы, кодеры, можете реплицировать нашу проблему, пожалуйста, зажгите огонь под MS, войдя в ваши учетные записи MS и отметив проблему как реплицированную вы (пока вы можете воспроизвести его). https://connect.microsoft.com/VisualStudio/feedback/details/824721/64bit-jit-compiler-works-very-slow-when-initializecomponent-method-is-processed

Обход: Очевидно, что вы можете включить оптимизацию выключить в компиляторе для проекта, а также, но если вы хотите, чтобы оставить их и просто ориентироваться на конкретные формы, следующие работает.

При вводе конструктора файл и поместить эту строку выше InitializeComponent

Оказывается, что Microsoft создает новый JIT. Вызывается RyuJIT. Однако, чтобы получить этот удивительный новый набор ошибок, вы должны перейти на Windows 8.1!

+0

Это интересно .. учитывая, что вы пробовали NGEN'ing, и это было все еще медленно. –

+0

То, о чем мы думали. Ngen сделал очень мало различий. Однако, как только мы нашли статью о подключении, все стало иметь смысл. Я пытаюсь представить пример для Dour High Arch, который демонстрирует это, поскольку я не могу освободить код, который мы видели в этом. Надеюсь, я смогу воспроизвести его. – Wizengamot

Смежные вопросы