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