Как лучше сравнить производительность .NET с производительностью VB 6 на сайте клиента? - PullRequest
2 голосов
/ 24 октября 2008

Два вопроса:

  1. Может кто-нибудь указать мне на объективные данные, которые сравнивают производительность .NET с производительностью VB 6? Я искал, но найти его на удивление сложно.
  2. Каков наилучший способ сравнить производительность .NET с производительностью VB 6, когда приложение ведет себя на сайте клиента?

У нас есть клиент-серверное приложение WindowsForms (написано для 2.0, скоро обновляется до 3.5 SP 1), о котором некоторые клиенты жалуются на «медленную производительность» по сравнению с предыдущей версией VB 6. Я знаю, что «медленная производительность» очень расплывчата и носит общий характер, но правда ли предположить, что код .NET может быть медленнее, чем код VB 6, потому что .NET работает в ВМ? Я написал 100% кода на C #, поэтому он не был перенесен каким-либо третьим лицом или мастером.

Не все клиенты подают эту жалобу, поэтому мы подозреваем что-то экологическое. Является ли наш единственный способ измерить производительность на сайте клиента? Некоторые из наших клиентов используют SQL Server 2005 на Windows Server 2003 в сети Novell. Будут ли они видеть совершенно другую производительность доступа к данным, чем аналогичный компьютер в сети Windows?

Ответы [ 8 ]

4 голосов
/ 25 октября 2008

Первое, что мне нужно упомянуть, это то, что код .Net никогда не запускается на виртуальной машине. Несмотря на то, что программы .Net скомпилированы в IL, который в некоторой степени аналогичен Java ByteCode, важное отличие состоит в том, что IL в свою очередь компилируется в полностью нативный код перед запуском приложения, а не интерпретируется виртуальной машиной.

Переход к сравнению .Net / VB6. Я не могу указать конкретные данные, но из личного опыта это зависит от того, что вы делаете.

Чтобы проиллюстрировать это, давайте подумаем о шести различных тестовых приложениях, каждое с версией vb6 и .Net. Каждое приложение выбирает определенную операцию, выполняет ее 100 000 раз, а затем записывает количество времени, которое потребовалось. Обратите внимание, что это мысленный эксперимент: я не видел результатов реальных приложений. Но я чувствую, что чувствую сильные и слабые стороны обеих платформ.

  • Приложение A выполняет серьезное вычисление с большим количеством процессоров. В этом случае я должен полагать, что результаты здесь будут почти идентичны. И VB6, и .Net компилируются до собственного кода, поэтому инструкция cpu mult одинакова независимо. Тем не менее, если вы не используете Option Strict, вы можете быстро получить проблемы на любой платформе. Поскольку вы использовали C # (по сути, это всегда Option Strict), это может дать вашему .Net коду преимущество.

  • Приложение B выходит и получает значение из базы данных. Опять же, результаты, вероятно, очень близки, хотя мне пришлось бы дать .Net очень небольшое преимущество по двум причинам: он использует собственный клиент sql, который предположительно немного быстрее, и выполняет такие вещи, как автоматический пул соединений и делает проще выделить такие вещи, как подключение один раз и повторное использование этого подключения, а не повторное подключение. Но если вы сравните яблоки с яблоками в том, что касается кода, они, вероятно, будут очень близки.

  • Приложение C показывает и скрывает форму несколько раз. Здесь я должен был бы дать vb6 кивок. Он основан на старом, менее блестящем наборе виджетов, который, откровенно говоря, будет дешевле отображать. Кроме того, компоненты WinForms не известны своей быстротой. Тем не менее, разница, вероятно, не так велика, как вы думаете, и вы, вероятно, тоже не полностью перерисовываете формы. Вероятно, это медлительность, на которую жалуются ваши пользователи.

  • Приложение D основано на строковых операциях, и здесь я должен дать добро .Net. И VB6, и .Net известны медленными строковыми операциями. Однако .Net предоставляет ряд инструментов, которые просто не доступны в vb6, чтобы помочь разработчикам преодолеть медлительность. Тем не менее, если вы не знаете об этих инструментах, неправильный выбор строковых операций может легко затормозить ваше приложение, выполняя бесполезную работу. Это также может привести к жалобам пользователей.

  • Приложение E будет многократно загружать XML-документ в память. Опять же, я должен думать, что .Net будет иметь преимущество. Прежде всего, инструменты xml, доступные для vb, были в лучшем случае примитивными. Я считаю маловероятным, что они не были значительно улучшены. Кроме того, сборщик мусора .Net довольно умен, предоставляя ему преимущество или выделяя и освобождая память во время загрузки. Тем не менее, я думаю, что самым важным здесь будет скорость диска, а это значит, что разница не будет такой большой.

  • Приложение F будет многократно запускать программу .Net или vb6, ждать, пока оно станет готовым (для некоторого определения «готово»), и затем закрывать его. Здесь vb6, вероятно, имеет преимущество по двум причинам. Во-первых, .Net должен скомпилировать IL для байт-кода при первом запуске. К счастью, это только первый запуск. В-третьих, приложение .Net также должно загружать любые ссылочные сборки. Для сравнения, время выполнения VB6 на намного меньше. Однако это обычно справедливо только в первый раз, когда вы запускаете приложение на определенной машине, и есть способы предварительной компиляции кода .Net. Это также может способствовать воспринимаемой медлительности.

Одним из важных моментов является то, что для всех этих приложений приложение .Net, вероятно, будет занимать намного больший объем памяти. По некоторым причинам разработчики склонны думать об этом как о плохой характеристике производительности, хотя на самом деле все наоборот. Если ваше приложение использует больше памяти, оно, вероятно, тратит меньше времени на запись на диск, и диск намного медленнее. Это, вероятно, также кеширование больше, что экономит время процессора. А для .Net, в частности, это экономит операции выделения / освобождения для периодов, когда это важнее или когда компьютер бездействует.

У меня нет времени, но было бы интересно увидеть, как кто-то использует реализацию StopWatch (по крайней мере, для .Net), упомянутую в Today Coding Horror , чтобы получить реальные тесты для каждого из них.

4 голосов
/ 24 октября 2008

Производительность в значительной степени всегда зависит от того, что вы делаете.

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

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

2 голосов
/ 25 октября 2008

О, это легко увидеть. Скопируйте и вставьте 50 кнопок в форме как в WF, так и в VB6 и сравните их скорость рисования рядом. Это не медленный .NET, а медленный WF. Я действительно никогда не прибивал это, но способствующие факторы:

  • Класс Button рисует очень медленно. Он просит контейнер нарисовать фон для прозрачности, которой у него нет.
  • VB6 имеет несколько элементов управления без окон, как Label. В WF каждый элемент управления является окном.
  • Визуальные стили не предоставляются бесплатно.
  • Они очень усердно работали над тем, чтобы VB1 хорошо работал на 386SUX.
2 голосов
/ 25 октября 2008

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

В контексте вашей большей озабоченности, то есть клиенты жалуются, что приложение .net работает медленнее, чем VB6, вы серьезно задумываетесь о понижающем преобразовании, если узнаете, что VB6 действительно быстрее? Если нет, зачем тратить время на тестирование?

Даже если вы можете окончательно доказать, что ваши клиенты не правы, а .net работает быстрее, вы ничего не выиграете, отклонив жалобы клиентов. Потратьте время на решение проблемы, а не на обсуждение причин, в итоге все будут счастливее.

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

2 голосов
/ 24 октября 2008
  1. Я никогда не искал данные такого рода. Вы можете взглянуть на каноническое приложение «Pet Shop», которое часто используется для целей бенчмаркинга. Он, вероятно, доступен в обоих вариантах платформы dev. Я подозреваю, что №2 гораздо важнее ответить. Кому интересно, работает ли Pet Shop быстро. Это приложение вашего клиента имеет значение.

  2. Большинство проблем с производительностью связаны с базой данных и / или сетью. Если бы вы вносили значительные изменения в базу данных между версиями, я бы сначала профилировал их с помощью инструментов трассировки / профилирования SQL или просто запустил несколько простых тестов для ключевых процедур / sql, которые выполняются для поддержки ваших так называемых форм с «низкой производительностью».

Если я правильно вас понимаю, у некоторых клиентов это нормально, а у других - нет, и кто-то пытается убедить вас в том, что это .NET и VB6, но спасибо вам большое. Различия в сети между клиентами, безусловно, является критическим различием. Серверная ОС, скорость коммутаторов, сетевая инфраструктура и т. Д. - так много переменных для изучения. Но я готов поспорить, что это не имеет ничего общего с .NET против VB6.

1 голос
/ 24 октября 2008

Если вы говорите об одном и том же клиентском приложении, написанном на VB 6.0 и VB.NET, то приложение VB 6.0, скорее всего, быстрее попадет на первый экран (из-за совместимости .NET JIT и загрузки ассемблера). После этого производительность должна быть примерно такой же.

Проблема в любой реальной ситуации заключается в том, что приложения будут проектироваться по-разному, и настоящее сравнение производительности не будет иметь смысла

0 голосов
/ 31 марта 2009

У поклонников .Net есть тысяча оправданий. В какой-то момент Microsoft запретила сравнения, вероятно, с причиной.

Одной из причин того, что .Net работает медленно, является стоимость запуска во время выполнения. Часть этого - время, необходимое для JIT-компиляции. Часть этого - сборка мусора. Отчасти это связано с чрезмерным потреблением памяти, что может привести к большему количеству перестановок. Частично это связано с тем, что за пределами встроенного кода (то есть вызовов ОС, многих стандартных библиотек) требуется выполнение через уровни COM и Win32 для достижения цели.

Новые машины с огромной памятью и несколькими быстрыми скоростями CPUS и жестких дисков маскируют часть этого. Маскировка не делает ее менее расточительной.

.Net была нацелена на то же, что и Java. Быстро написанный одноразовый код и материал на стороне сервера, который остается загруженным и работает в течение длительных интервалов.

0 голосов
/ 24 октября 2008

Производительность по сравнению с приложением VB6, вероятно, обусловлена ​​скорее дизайном приложения, чем c # по сравнению с VB6. Я бы предположил, что в 9,5 / 10 раз приложение C # будет быстрее, если разработано правильно. .Net не работает внутри виртуальной машины. CLR JIT компилирует приложение .Net для кода машинного уровня, что делает его чертовски быстрым. Причина в том, что работает немного медленнее, чем в неуправляемом коде, в том, что песочница .Net запускается под управлением, и это имеет некоторые накладные расходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...