2008-10-08 3 views
18

Это действительно два вопроса, но они настолько похожи, и сохранить его простым, я решил просто свернуть их вместе:Ускорение C#

  • Во-первых: Дано # проект создан C , каковы некоторые достойные способы ускорить его за рамки простой оптимизации кода?

  • Во-вторых,: При написании программы с нуля на C#, какие хорошие способы значительно повысить производительность?

Пожалуйста, держаться подальше от общих методов оптимизации, если они не C# конкретные.

Ранее упомянуто Python, Perl и Java.

+0

Прошу прощения, но общие методы оптимизации по определению являются общими, они не могут быть C# специфическими :-). – 2008-10-08 14:42:16

ответ

0

NGEN поможет с некоторым кодом, но не берет на него.

Лично, если ваш дизайн плох/медленный, вы не можете много сделать.

Лучшим предложением в таком случае является реализация некоторой формы кэширования дорогостоящих задач.

+0

ngen может ускорить запуск программы .NET, но это может повредить производительность после запуска (она не оптимизируется довольно агрессивно). – 2008-10-08 14:28:17

+0

Следовательно, почему я сказал, что не банк. :) – leppie 2008-10-08 14:35:30

+0

Но важно то, что если вы говорите о производительности без запуска, ngen вообще не поможет. – 2008-10-08 14:45:37

2

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

18

Off верхней части моей головы:

  • Заменить необщие варианты контейнеров классов по их родовому коллегами
  • вырублен по боксу/распаковке. В частности, используйте генераторы, где это возможно, и, как правило, избегайте пропускать типы значений как object.
  • Для диалогов с использованием многих динамических элементов управления: приостановите рисование до тех пор, пока не вставьте все элементы управления, используя SuspendLayout/ResumeLayout. Это особенно важно при использовании макетов контейнеров.
9

Простая вещь заключается в том, чтобы ваша конфигурация сборки была установлена ​​на «Release». Это позволит оптимизировать и исключить отладочную информацию, делая ваш исполняемый файл меньше.

Дополнительная информация on MSDN при необходимости.

12

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

  • Мера против реалистичных нагрузок
  • четко определенные цели, чтобы направлять вас
  • Используйте хороший профайлер
  • Оптимизировать архитектура/дизайн относительно раннего
  • только микро- оптимизируйте, когда у вас есть проверенная проблема.

Когда вы абсолютно доказали, что вам нужно микро-оптимизировать, про filer имеет тенденцию делать очевидным, что искать - такие вещи, как избегать бокса и виртуальных вызовов.

О, одна вещь, о которой я могу думать, которая специфична для .NET: если вам нужно часто звонить и в настоящее время использовать отражение, convert those calls into delegates.

EDIT: Другие ответы, предлагающие использование дженериков и StringBuilder и т. Д., Конечно, правильны. I (вероятно, ошибочно) предположили, что эти оптимизаций были слишком «очевидны»;)

+0

@your edit: Я думаю, что хорошо не повторять слишком много советов. Реальный ответ на вопрос часто представляет собой совокупность всех ответов. – 2008-10-08 14:55:17

3
  • Используйте StringBuilder, а не много конкатенации. Строковые объекты являются атомарными, а любая модификация (добавление, верхнее, заполнение и т. Д.) Фактически генерирует совершенно новый строковый объект, а не модифицирует оригинал. Каждая новая строка должна быть выделена и в конечном итоге собираться мусором.

  • Обобщение предыдущего утверждения: попробуйте повторно использовать объекты, а не создавать партии и многие из них. Выделение и сбор мусора может быть легко сделать, но они поражают вашу производительность.

  • Обязательно используйте предоставленные библиотеки Microsoft для большинства вещей. В классах, предоставляемых Framework, часто используются функции, которые недоступны или труднодоступны из вашего собственного кода на C# (т. Е. Совершают вызовы в родной Windows API). Встроенные библиотеки не всегда наиболее эффективные, но чаще всего.

  • Написание асинхронных приложений никогда не было таким простым. Изучите такие вещи, как класс BackgroundWorker.

  • Постарайтесь не указывать Структуры, если вы не действительно нуждаются в них. Каждый экземпляр класса содержит ссылку на фактический экземпляр, в то время как переменные экземпляра структуры содержат отдельную копию.

0

Использование Ngen.exe (Должно прийти поставляется с Visual Studio.)

http://msdn.microsoft.com/en-us/library/6t9t5wcf(VS.80).aspx

Генератор Native Image (Ngen.exe) является инструментом, который повышает производительность управляемых приложений , Ngen.exe создает собственные образы, которые представляют собой файлы, содержащие скомпилированный процессорный код для конкретного процессора, и устанавливает их в собственный кеш образа на локальном компьютере. Время выполнения может использовать собственные изображения из кэша вместо использования компилятора «точно в срок» (JIT) для компиляции исходной сборки.

0

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

Я настоятельно рекомендую использовать инструмент профилирования кода, такой как ANTs Profiler by RedGate. Я обнаружил, что после принятия стандартных шагов для оптимизации, использующих Profiler, я могу еще больше оптимизировать свой код, быстро идентифицируя области (области) кода, которые наиболее сильно пострадали от приложения.

3

Использование композиции вместо наследования, ограничение бокса/распаковки, использование общих коллекций, использование циклов foreach вместо {} с помощью счетчика и выпуск ресурсов со стандартным шаблоном Dispose.

Эти детали подробно описаны в превосходной книге «Эффективный C#».

3

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

9

Используйте качественный профилировщик и определите, где ваши узкие места.

Затем начните спрашивать, как улучшить производительность.

Любой, кто делает какие-либо общие заявления, такие как «избегать отражения», не понимая как свой профиль производительности, так и ваш проблемный домен, должен быть снят (или, по крайней мере, перевоспитан). И учитывая размер ландшафта .Net, почти бессмысленно говорить о оптимизации C#: говорим ли мы о WinForms, ASP.Net, BizTalk, Workflow, SQL-CLR? Без контекста даже общие рекомендации могут быть в лучшем случае пустой тратой времени.

Рассмотрите также то, что вы подразумеваете под «ускорить его» и «улучшить производительность». Вы имеете в виду большую ресурсоэффективность или более низкое воспринимаемое время ожидания для конечного пользователя (при условии, что оно есть)? Это очень разные проблемы для решения.

Учитывая форум, я чувствую себя обязанным отметить, что в Code Complete есть довольно неплохое освещение этих тем. Не особый ум C#. Но это хорошо. Имейте в виду, что языковые специфические микрооптимизации могут быть включены в следующую версию того компилятора, который вы используете. И если для вас важна разница между for и foreach, вы, вероятно, пишете C++ в любом случае, верно?

[Мне понравилось RedGate в ANTS Profiler, но я думаю, что это может быть улучшено]

При том, что путь, некоторые мысли:

  • Используйте тип (SomeType) в предпочтении к instance.GetType(), если это возможно
  • Использование Еогеасп в предпочтение для
  • Избегайте бокс
  • До (я думаю) 3 строки это нормально, чтобы делать StringA + StringB + StringC.После этого вы должны использовать StringBuilder
0

Это верно для любого языка, а не только C#

  1. Для существующего приложения, не делать ничего, пока вы не знаете, что делает его медленным , IMHO, this is the best way.

  2. Для новых приложений проблема заключается в том, как преподаются программисты. Их учат делать горы из мухи. После того как вы оптимизировали несколько приложений, используя this, вы будете знакомы с проблемой того, что я называю «галопирующей общностью» - слоем слоя «абстракция», а не просто вопросом, что требует эта проблема. Лучшее, на что вы можете надеяться, - бежать вперед после них, рассказывая им, какие проблемы с производительностью они только что вложили, чтобы они могли вытащить их, когда они идут.

-1

Для Windows Forms на XP и Vista: поверните двойную буферизацию по всей доске. Это вызывает проблемы прозрачности, так что вы определенно хотите, чтобы проверить интерфейс:

protected override System.Windows.Forms.CreateParams CreateParams { 
    get { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle = cp.ExStyle | 0x2000000; 
     return cp; 
    } 
} 
0

Кэширование элементы, которые являются результатом запроса:

private Item _myResult; 
public Item Result 
{ 
    get 
    { 
      if (_myResult == null) 
      { 
       _myResult = Database.DoQueryForResult(); 
      } 
      return _myResult; 
    } 
} 

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

Ответ портирован на вопрос, которым управлял обман этого.

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