Files
multithread_experiments/readme.md

3.2 KiB
Raw Blame History

multithread_experiments

Результаты на Windows

Измерения производительности проводились с -O3 оптимизацией.

Эксперименты с мьютексами в одном потоке

Наибольшие накладные расходы на синхронизацию несет PIMutex проигрывающий остальным способам в ~50-100 раз. Остальные результаты соизмеримы, при этом вариант std::atomic в эксперименте использует менее строгие правила защиты кода и в реальных задачах применим не всегда.

without synchronization: 1.487 ms
piMutex: 959.774 ms
piConditionLock: 15.873 ms
stdMutex: 13.414 ms
stdAtomic: 6.448 ms

Эксперименты с мьютексами в нескольких потоках

Как и в однопоточном тесте, PIMutex оказывается самым медленным, проигрывая остальным механизмам синхронизации в ~18-120 раз. При этом производительностьPIConditionLock начинает заметно снижаться по сравнению с однопоточным тестом, отставая в ~4 раза от std::mutex.

piMutex: 3237.55 ms
piConditionLock: 179.799 ms
stdMutex: 25.5425 ms
stdAtomic: 16.6967 ms

Эксперименты с std::packaged_task и др. способами хранения функций

В тестах все способы кроме std::packaged_task показали приблизительно одинаковый результат. Вероятно, много ресурсов расходуется на создание пары future-promise.

Direct call by pointer: 261.328 ms
Lambda with function wrapper: 241.38 ms
std function with function wrapper: 266.289 ms
Packaged task with function wrapper: 2476.41 ms

Результаты на Linux

Измерения производительности проводились с -O3 оптимизацией.

Эксперименты с мьютексами в одном потоке

Средства синхронизации показали соизмеримый результат. std::atomic с менее строгими правилами синхронизации показал ожидаемо лучший результат.

without synchronization: 1.59 ms
piMutex: 16.41 ms
piConditionLock: 16.622 ms
stdMutex: 15.367 ms
stdAtomic: 6.82 ms

Эксперименты с мьютексами в нескольких потоках

Все средства синхронизации, за исключением std::atomic показали соизмеримый результат. В эксперименте std::atomic показал лучший в ~5 раз результат, а значит может иметь смысл варьировать строгость правил синхронизации.

piMutex: 84.2275 ms
piConditionLock: 89.8308 ms
stdMutex: 77.0943 ms
stdAtomic: 13.029 ms