Это очень легко заставить многие потоки работать хуже, чем один поток.Ключ к успешной многопоточности и ускорению заключается в том, чтобы понять не только тот факт, что программа является многопоточным, но и точно знать, как взаимодействуют ваши потоки.Вот несколько вопросов, которые вы должны задать себе при просмотре кода:
1) Разделяют ли отдельные потоки ресурсы?Если да, что это за ресурсы, и когда вы обращаетесь к ним, они блокируют другие потоки?
2) На какой самый медленный ресурс опирается ваш многопоточный код?Распространенным узким местом (и часто игнорируемым) является дисковый ввод-вывод.Несколько потоков могут обрабатывать данные намного быстрее, но они не заставляют читать диск быстрее, и во многих случаях многопоточность может сделать его намного хуже (например, трэшинг) .
3) Доступ к общемуресурсы правильно синхронизированы?
С этой целью, и, не зная больше о вашей проблеме, я бы порекомендовал:
a) Не читать разные файлы из разных потоков.Вы хотите, чтобы дисковый ввод-вывод был максимально последовательным, а это проще всего из одного потока.Может быть, пакетное чтение файлов из одного потока и , а затем отправка их на обработку.
b) Держите ваши потоки настолько автономными, насколько это возможно - любое общение назад и вперед приведет к конфликту потоков и замедлит процесс.