Есть программа на С++, которая читает размеры и сигнатуры файлов, а также считает их хэши. Я решил распараллелить её посредством std::async. Всё вроде нормально, кроме одного момента: на одних и тех же файлах с одними и теми же результатами программа может выполняться почти на минуту быстрее/дольше:
87,98s user 19,80s system 75% cpu 2:23,52 total
...
76,20s user 17,61s system 113% cpu 1:22,71 total
...
85,96s user 18,13s system 73% cpu 2:20,75 total
И так далее. Я раз 30 прогнал программу, обычно она выполняется за ~2:20, но время от времени - за ~1:20.
Сначала я подумал, что наборы файлов по-разному распределяются по потокам, вставил подсчёт размера набора для каждого потока - оказалось что нет, наборы всегда одинаковые. Но вот время выполнения почему-то разное.
Программа выполняется в Linux, количество потоков в программе равно количеству потоков процессора (в моём случае - 8), целевой каталог с файлами лежит на SATA SSD. Системный кэш между прогонами сбрасывается. Во время всех прогонов состояние системы примерно одинаковое: запущены одни и те же программы, в фоне играет плеер, я смотрю в диспетчер задач. Целевой каталог с файлами, повторюсь, один и тот же, он точно не меняется от прогона к прогону. И результаты работы программы одинаковые полностью.
Подскажите хотя бы примерно, куда смотреть. Может ли это быть результатом ситуативной работы планировщика процессов в Linux? Всё-таки такая большая разница...
Или может быть это из-за того, что в программе широко используются std::unordered_map и std::unordered_set? Я слышал, их реализация далека от идеальной.