# 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 ```