Я пытался использовать рабочие потоки для ускорения более крупного алгоритма, когда я заметил, что использование независимой очереди приоритетов для большего количества потоков фактически замедляет производительность. Поэтому я написал небольшой тестовый пример.Медленная производительность рабочего потока с приоритетной очередью
В котором я запрашиваю, сколько потоков нужно запустить, установите каждый поток на свой собственный процессор и нажмите и вытащите множество вещей из моих очередей приоритетов. Каждый поток владеет собственной очередью приоритетов, и они выделяются отдельно, поэтому я не подозреваю о ложном совместном использовании.
Я положил тестовый пример here, потому что он длиннее фрагмента. (бит аффинности процессора относится к NCrunch)
Очередь приоритетов принадлежит моему собственному виду, поскольку .NET не имеет встроенной очереди. Он использует Pairing Heap, если это имеет значение.
Во всяком случае, если я запускаю программу с одним потоком и одним ядром, он получает около 100% использования. Использование капель с двумя резьбами/двумя сердечниками И в конечном итоге сжимает до 30% использования со всеми 8 сердечниками.
Это проблема, поскольку падение производительности сводит на нет любые выгоды от многопоточности. Что вызывает снижение производительности? Каждая очередь полностью независима от других потоков.
Если вы работаете с процессором с несколькими физическими ядрами (и включенным гиперпотоком), все это может быть нормальным. См. Http://superuser.com/questions/133082/hyper-threading-and-dual-core-whats-the-difference и http://superuser.com/questions/420329/single-threaded-program-takes-too -low-cpu –
Хм, мне придется попробовать отключить гиперпоточность. Но если я сделаю что-то вроде http://stackoverflow.com/questions/39395/how-do-i-calculate-pi-in-c Calculate Pi, я получаю 100% по всем направлениям. – Tocs
@Tocs Пожалуйста, опубликуйте свои результаты. У меня была аналогичная проблема, и я не понимаю, что может быть виновата гиперпоточность. – AngryHacker