Код C # работает быстро на IIS, но медленно на Mono - как его улучшить? - PullRequest
8 голосов
/ 21 января 2011

У меня есть приложение ASP.NET, которое хорошо работает на моей машине для разработки Windows. Сервер на Linux работает под управлением Mono, и после загрузки тот же код выполняется в 4 или 5 раз медленнее, чем на Windows (например, 25 секунд против 5 секунд для одной задачи).

Является ли это исполнение известной проблемой с Mono? И что я могу с этим поделать? Код в основном обрабатывает текст, строковые замены, регулярные выражения и тому подобное, если это имеет значение. Я профилировал и отлаживал свой код, используя VS локально, но я не знаю, возможно ли выполнить удаленную отладку на сервере с Mono, или что мне нужно сделать, чтобы исправить это на самом деле.

Ответы [ 5 ]

6 голосов
/ 21 января 2011

Регулярные выражения - особенно слабая область для Моно.Класс Regex в Mono всегда использует интерпретированный код, в то время как .Net может превратить его в скомпилированный IL, что приводит к гораздо более быстрому выполнению.

Большинство других форм обработки текста, таких как замены, должны быть примерно одинаковыми.

4 голосов
/ 23 января 2011

Установите Mono, желательно в системе Linux, аналогичной вашему серверу.Профилируйте свой код на Mono и посмотрите, где узкие места.

У меня есть приложение Mono, работающее на сервере Linux, которое следует файлам журнала Apache.Я разработал его для Windows и при тестировании в Linux обнаружил, что на Mono 2.4 он будет примерно в 8-10 раз медленнее, чем на .NET 3.5.Большую часть времени он проводит в Regex.Match и строковых функциях.Мне удалось удвоить общую скорость программы в Mono, просто указав StringComparison.Ordinal в 4 вызовах string.EndsWith ().Если вам нужны порядковые сравнения строк, это может дать вам повышение скорости.

Даже с StringComparison.Ordinal, string.StartsWith () все еще работал медленно.Я получил 25% -ное увеличение общей скорости программы , написав свою собственную версию string.StartsWith ().

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

1 голос
/ 21 января 2011

Согласно этому академическому исследованию , производительность Mono может быть снижена в некоторых дистрибутивах Linux из-за "гораздо более быстрой склонности некоторых систем Linux переходить в кэш / область подкачки жесткого диска" [по сравнению с Windows].

"Обратите внимание на огромную разницу, указанную в двух операционных системах, даже использующих собственный код. При 131072 целых числах в массиве операционная система Fedora Core 4 Test 3 работала более чем в 3 раза медленнее, чемточно такой же код в Windows. "

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

1 голос
/ 21 января 2011

Используете ли вы mod_mono или mod_proxy для этого?Хотя существуют ограничения на то, что вы можете получить от Mono, вы также получите меньшую общую задержку при использовании mod_mono, чем mod_proxy.

См. Раздел "mod_mono и mod_proxy" на Mono ASP.NET FAQ

1 голос
/ 21 января 2011

Вы используете объекты StringBuilder или делаете цепочку строк.Если вы выполняете много строковой работы, вы можете столкнуться с некоторыми ошибками в производительности.

Но я думаю, что у Леппи это на голову, Microsoft потратила много денег на тестирование и интеграцию ASP.net в IIS, так что это было, действительно быстро.Если вы не хотите платить за коробку MS, вам придется столкнуться с тем фактом, что Mono является открытым исходным кодом, а IIS является проверенным коммерческим продуктом.

Хороший пример здесь, гдеMicrosoft фактически модифицировала саму Windows библиотекой режима ядра, которая работает с сервером IIS.Правильно спроектированные приложения, использующие кеш должным образом, могут получить очень хорошее увеличение производительности в этом коде: HTTP.sys

...