73 lines
3.2 KiB
Markdown
73 lines
3.2 KiB
Markdown
# 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
|
||
``` |