Все потоки на самом деле не работают одновременно.
На настольном компьютере, я полагаю, у вас есть двухъядерный процессор (может быть, максимум четыре). Это означает, что одновременно могут работать только 2/4 потока.
Если вы создали 30 потоков, ОС придется переключать контекст между этими 30 потоками, чтобы все они работали. Переключение контекста довольно дорого, поэтому замедление.
В качестве основного предложения, я бы стремился к 1 потоку на процессор, если вы пытаетесь оптимизировать вычисления. Более того, и вы не выполняете никакой дополнительной работы, вы просто меняете потоки в одном и том же процессоре. Постарайтесь представить себе, что на вашем компьютере ограниченное число рабочих, и вы не можете выполнять больше работы одновременно, чем количество имеющихся у вас рабочих.
Некоторые из новых функций в библиотеке параллельных задач .net 4.0 позволяют вам делать вещи, которые учитывают масштабируемость в количестве потоков. Например, вы можете создать кучу задач, и библиотека параллельных задач сама определит, сколько процессоров у вас есть, и оптимизирует количество создаваемых / используемых потоков, чтобы не перегружать процессоры, чтобы вы могли создать 30 задач, но на двухъядерной машине библиотека TP все равно будет создавать только 2 потока и ставить в очередь. Очевидно, это очень хорошо масштабируется, когда вы запускаете его на более крупной машине. Или вы можете использовать что-то вроде ThreadPool.QueueUserWorkItem(...)
, чтобы поставить в очередь кучу задач, и пул будет автоматически управлять тем, сколько потоков используется для выполнения этих задач.
Да, создание потоков занимает много времени, но если вы используете пул потоков .net (или библиотеку параллельных задач в 4.0), .net будет управлять созданием потоков, и вы можете обнаружить, что он создает меньше потоков, чем количество задач, которые вы создали. Это внутренне поменяет ваши задачи на доступные потоки. Если вы действительно хотите контролировать явное создание реальных потоков, вам необходимо использовать класс Thread.
[Некоторые процессоры могут делать умные вещи с потоками и могут иметь несколько потоков, работающих на одном процессоре - см. Гиперпоточность - но посмотрите ваш менеджер задач, я был бы очень удивлен, если у вас более 4- 8 виртуальных процессоров на современных компьютерах]