2010-04-13 3 views
3

Я сделал кучу тестов с фреймворком 4.0 и старше, и я не понимаю, почему тот же код работает медленнее при использовании WPF по сравнению с Windows Forms:Почему тот же самый код в WPF работает медленнее, чем в Windows Forms?

Это код, он не имеет ничего общего с пользовательским интерфейсом элементы:

 Random rnd = new Random(845038); 
     Int64 number = 0; 
     for (int i = 0; i < 500000000; i++) 
     { 
      number += rnd.Next(); 
     } 

код занимает 5968ms - 6024ms для выполнения в Windows Forms и 6953ms в WPF.

Вот сообщение с загружаемым раствором: http://blog.bettiolo.it/2010/04/benchmark-of-net-framework-40.html

+0

У тестируемого интерфейса WPF есть некоторые функции, работающие в фоновом режиме, например анимации? В любом случае, я верю, что WPF всегда что-то делать, даже когда он должен быть бездействующим :) –

+1

На самом деле, один прогон не является надежным способом получить хорошие ориентиры. Вы должны измерить несколько раз и рассчитать среднее время. –

+0

@ 0XA3 Я сделал много запусков в разные моменты, и у меня были аналогичные результаты. –

ответ

1

Когда я загрузил zip-файл и посмотрел на ваш код, проблема стала очевидной: Это не тот же код.

Поскольку два теста имеют разный код, они компилируются по-разному с помощью компилятора C# и оптимизируются JIT-компилятором. Для локальных переменных назначаются разные регистры. Используются различные методы вызова. Используются разные смещения стека.

Вот несколько отличий я отмечал между двумя эталонными методами:

  1. Они принимают различные типы параметров
  2. Они содержат различное число (9 против 7) и типов локальных переменных
  3. Они делают разные номера вызовов методов
  4. У них разное количество петель
  5. Один вызов Application.DoEvents(), а другой не

Я полагаю, что в вашей версии кода WinForms компилятор JIT разместил переменную i в смещении стека, тогда как в версии WPF она поместила ее в регистр, который затем необходимо сохранить на каждом итерация.

В любом случае, не стоит винить разницу в WPF и WinForms: обвинять разницу в наличии двух разных тестов, которые выглядят внешне похожими, но оптимизированы по-разному.

Разбить код тестирования на статический метод в отдельном классе. Если вы используете идентичный код в обоих тестах, я могу в значительной степени гарантировать вам, что вы получите одинаковые результаты.

3

Многое может произойти в течение шести секунд на машине Windows. Я бы предположил, что фоновая обработка, которая имеет место в WPF, немного отличается (и несет немного больше служебных данных), чем то, что происходит в Winforms.

+1

Интересно, что консольное приложение дает аналогичные тайминги, такие как приложение WPF на моем компьютере (от 6,5 до 6,8 секунд), тогда как приложение WinForms 4.0 работает быстрее (от 6,0 до 6,2 сек). –

+0

снова тезисы тестов должны проходить от 24 до 48 часов для честных чтений. – deanvmc

+1

@Robert Harvey: Я делал различные прогоны в разные моменты, и это давало мне подобные результаты. –

1

У вас есть какая-то форма, показывающая на экране? Я думаю, что накладные расходы для формы могут быть тем, что вы видите.

+0

Да. В обоих тестах была показана форма с тремя элементами управления. Во время цикла форма работает на холостом ходу. –

3

Первый цикл работает с той же скоростью для меня.

Вы измеряете без отладчик прилагается?

+0

Первый цикл в коде работает с той же скоростью для меня. –

+0

Я запускал код освобождения без информации pdb и дважды щелкнул exe из проводника. –

2

Прежде всего, чтобы исключить какие-либо факторы окружающей среды, вы должны были бы запустить этот тест для каждого решения в течение 24-48 часов. Во-вторых, ошибочная логика его медленности. Если вы отделите какой-либо gui-gode от этого приложения, вы увидите, что оба они нацелены на одну и ту же платформу ergo, они не должны быть разными.

Если вы тестируете, какая инфраструктура графического интерфейса работает быстрее, ваш тест недействителен, так как он не играет ни с сильными, ни с слабыми сторонами. Для тестирования WPF в Winforms таким образом необходимо упустить фундаментальные различия между обеими структурами.

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

Тот факт, что базовая модель может быть настолько разной, означает, что любое тестирование такого характера было бы субъективным. Я не доверяю испытаниям такого характера просто потому, что они либо пытаются доказать точку зрения авторов, либо опровергнуть чужие методы.

Я бы не стал беспокоиться о скорости просто потому, что если у клиента есть возможность правильно запускать приложение WPF, то выгоды или промахи будут настолько незначительными, что они не будут иметь значения.

+1

Зачем вам 24 часа? Десятки тестовых прогонов должны дать вам довольно неплохую фигурку. –

+0

Любой тест, на мой взгляд, должен работать в течение как минимум 24 часов, чтобы дать правильные цифры. Может быть любое количество задач, выполняющихся в фоновом режиме на машине, которая может через тесты отключиться. Предоставление им определенного количества времени в течение длительного периода времени нормализует результаты. О, btw, мой ответ не был нацелен на ваш ответ, а скорее комментарий под ним из 0xA3 – deanvmc

+1

В этом тесте я был специально не тестировал парня, и этот результат неудачи был очень интересным результатом. Результат должен быть таким же, но был другим. –