Я занимался параллельной библиотекой в .NET 4.0. Недавно я разработал обычную ORM для некоторых необычных операций чтения/записи, которые должна использовать одна из наших больших систем. Это позволяет мне украшать объект атрибутами и анализировать, какие столбцы он должен извлекать из базы данных, а также то, что XML должен выводить на записи.Многопоточность в .NET 4.0 и производительность
Поскольку я рассматриваю эту оболочку для повторного использования во многих проектах, я бы хотел как можно быстрее выжать из нее максимально возможную скорость. Эта библиотека будет в основном использоваться в веб-приложениях .NET. Я тестирую фреймворк, используя одноразовое консольное приложение, чтобы ткнуть в классы, которые я создал.
Теперь я извлек урок издержек, с которыми сталкивается многопоточность. Многопоточность заставляет его работать медленнее. От чтения вокруг кажется, что он интуитивно понятен людям, которые делали это в течение долгого времени, но на самом деле он интуитивно понятен мне: как можно запустить метод 30 раз в то же время быть медленнее, чем запустить его 30 раз подряд?
Я не думаю, что я вызываю проблемы несколькими потоками, которые должны сражаться за один и тот же общий объект (хотя я недостаточно хорош в этом, пока не знаю наверняка или нет), поэтому я предполагаю, что замедление исходя из накладных расходов, порождая все эти потоки и время выполнения, поддерживая их все прямо. Итак:
- Хотя я делаю это в основном как учебное упражнение, это пессимизация? Для тривиальных задач, отличных от IO, многопоточное избыточное число? Моя главная цель - скорость, а не отзывчивость пользовательского интерфейса или что-то еще.
- Запустил бы такой же многопотоковый код в IIS, чтобы ускорить его из-за уже созданных потоков в пуле потоков, тогда как прямо сейчас я использую консольное приложение, которое, как я полагаю, будет однопоточным, пока я не скажу в противном случае? Я собираюсь запустить некоторые тесты, но я полагаю, что есть некоторые базовые знания, которые мне не хватает, чтобы знать , почему было бы так или иначе. Мое консольное приложение также работает на моем рабочем столе с двумя ядрами, тогда как сервер для веб-приложения будет иметь больше, поэтому мне, возможно, придется использовать его как переменную.
Добавление немного к тому, что сказал Саймон, оптимальное количество потоков трудная вещь, чтобы найти, как это часто зависит от нагрузки системы в целом и то, что делает ваш код, мой лучший совет - экспериментировать с высокой нагрузкой, чтобы увидеть, что дает лучшую производительность. – Lazarus
@ Lazarus. Да, я полностью согласен, это очень верно. И это может быть очень специфичным для системы. Это то, что вы, вероятно, хотите каким-то образом разоблачить как настройки, чтобы его можно было настроить по отдельности, с некоторыми хорошими значениями по умолчанию. –