Меня попросили показать преимущества и ограничения Параллелизма и оценить его для использования в нашей компании. Мы - преимущественно ориентируемый бизнес данных, и по существу загрузите объекты из базы данных, затем проведите их через некоторую бизнес-логику, дисплей пользователю, затем сохраните назад к DB. В моем уме, нет слишком много в том трубопроводе, который извлек бы выгоду из выполнения параллельно, но быть довольно в новинку для понятия, я мог быть абсолютно неправым. Была бы какая-либо часть того простого трубопровода, который извлечет выгоду из выполнения параллельно? И есть ли какие-либо инструкции для того, как реализовать этот стиль программирования?
Кроме того, есть ли какие-либо инструменты (предпочтительно, которые идут с VS2010), который показал бы, где горлышки бутылки происходят и смогли бы визуально показать то, что продолжается, когда я нажимаю "Go" на простое приложение, которое выполняет данную сумму циклов (предзаписанные простые циклы математики, например, поскольку я как целое число = 1 - 1 000 - делаю некоторые вычисления), параллельно, затем последовательно?
Я должен смочь отобразить различие с помощью достойного профильного инструмента.
Да, даже из этой простой модели можно извлечь большую пользу от парралелизма.
Скажем, например, во время загрузки данных вы делаете что-то вроде этого:
foreach(var datarow in someDataSet)
{
//put your data into some business objects here
}
Вы можете оптимизировать это с помощью parrallelism, сделав что-то вроде этого:
Parrallel.ForEach(someDataSet, datarow =>
{
//put your data into some business objects here
});
Это может значительно увеличить производительность в зависимости от того, сколько данных вы обрабатываете.
Каждая строка данных теперь будет обрабатываться асинхронно, а не последовательно, как в типичном цикле foreach.
Я бы посоветовал вам провести несколько простых тестов производительности на таком же простом примере, как этот, и посмотреть, какие результаты вы получите. Зарисуйте их в электронную таблицу или что-то подобное и покажите их своей команде. Вы можете быть удивлены полученными результатами.
Возможно, но мой общий ответ на такого рода запросы, как правило, был бы следующим: Есть ли у вас проблемы с производительностью в ваших приложениях? Если да, то непременно выясните, почему, и подумайте, может ли помочь параллельное выполнение. Если нет, то время, вероятно, лучше потратить в другом месте.
Безусловно, есть много задач, которые можно распараллелить, подробный анализ может помочь, но узкие места являются возможными кандидатами.
Этот материал может помочь вам Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4
Вы можете получить больше пользы от внедрения слоя кэширования (распределенного или иного), чем от распараллеливания вашего текущего конвейера.
При использовании слоя кэширования объекты, которые вы часто используете, будут находиться в кэше в памяти, что обеспечивает гораздо более высокую производительность чтения/записи. Существует несколько вариантов синхронизации кэша, и они зависят от того, какого поставщика вы выберете.
Я бы предложил взглянуть на MemCached и NCache и посмотреть, подойдут ли они вам.
EDIT: Что касается инструментов профилирования, я широко использовал dotTrace и очень рекомендую его. Вы можете загрузить 30-дневную пробную версию с сайта JetBrains.
Вы заходили на сайт Microsoft Параллельные вычисления с управляемым кодом ? Он содержит несколько статей о рекомендациях по реализации, в которых обсуждается, когда и как использовать параллельные функции .Net 4.