Files
multithread_experiments/readme.md

73 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# multithread_experiments
## Результаты на Windows
Измерения производительности проводились с `-O3` оптимизацией.
### Эксперименты с мьютексами в одном потоке
Наибольшие накладные расходы на синхронизацию несет `PIMutex` проигрывающий остальным способам в `~50-100 раз`.
Остальные результаты соизмеримы, при этом вариант `std::atomic` в эксперименте использует менее строгие правила защиты
кода и в реальных задачах применим не всегда.
```cmd
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`.
```cmd
piMutex: 3237.55 ms
piConditionLock: 179.799 ms
stdMutex: 25.5425 ms
stdAtomic: 16.6967 ms
```
### Эксперименты с std::packaged_task и др. способами хранения функций
В тестах все способы кроме `std::packaged_task` показали приблизительно одинаковый результат. Вероятно, много ресурсов
расходуется на создание пары future-promise.
```cmd
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` с менее строгими правилами синхронизации показал
ожидаемо лучший результат.
```cmd
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 раз` результат, а значит может иметь смысл варьировать строгость правил синхронизации.
```cmd
piMutex: 84.2275 ms
piConditionLock: 89.8308 ms
stdMutex: 77.0943 ms
stdAtomic: 13.029 ms
```