Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Вычитал у Рихтера что SRWLOCK работает быстрее чем CRITICAL_SECTION. Решил проверить. Затестил на своей библиотеке акторов. Результат в млн. попугаев, т.е. млн. сообщений/сек. Процессор Потоков CSx32 SRWx32 CSx64 SRWx64i7 3770K (4 ядра + HT) DDR3 8 39.5 38.7 39.9 42.2i7 6700K (4 ядра без HT) DDR4 4 30.7 31.2 29.5 29.6 x32/x64 - битность при компиляции. Почти всегда SRWLOCK не хуже. Если кто хочет позапускать Исходники . Компилировать stress_test. Менять: #define CPU_MAX 8 // Количество потоков #define LT_WIN_XP // Вариант с CRITICAL_SECTION Результат смотреть в строке msg_send/sec ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 19:36 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Мы должны упомянуть в топике о справедливости распределения ресурса между потоками. Очередь и т.п. Иначе у читателя может сложится впечатление что SRWLOCK - панацея. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2018, 20:04 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
maytonМы должны упомянуть в топике о справедливости распределения ресурса между потоками. Очередь и т.п. Иначе у читателя может сложится впечатление что SRWLOCK - панацея. В этом плане CRITICAL_SECTION тоже не панацея. https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682530(v=vs.85).aspx There is no guarantee about the order in which waiting threads will acquire ownership of the critical section. PS Попробовал SRWLOCK использовать по полной, т.е. сначала блокировка только на чтение, далее при необходимости блокировка на запись. В моем случае не помогло, т.к. при записи надо снять блокировку на чтение, поставить блокировку на запись, перепроверить что не было изменений между снятием и постановкой блокировки. Все эти манипуляции съедают всю экономию от параллельного чтения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 06:39 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima T, ну, ясен пень - быстрее! В CRITICAL_SECTION до ч0рта лишнего, вплоть до специальной секции с отладочной информацией. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. для сравнения: Код: plaintext 1. 2. 3. 4. 5. 6. 7. В некоторых случаях можно применять inline функции с ассемблерной вставкой lock cmpxchg, будет еще быстрее. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 10:43 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima T, не понял какая польза от него для очереди, чтения то у тебя по сути нет, только запись (доставание из очереди тоже запись, так как меняет очередь) как то тестили мы раличные реализации RW-локов, там тоже всё не так однозначно, то что хорошо пашет на 10-ке например, тупит на 7-ке, и наоборот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 11:55 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima T, не понял какая польза от него для очереди, чтения то у тебя по сути нет, только запись (доставание из очереди тоже запись, так как меняет очередь) Польза в том что SRWLOCK быстрее работает, разве что на более свежем проце в x32 немного отстал. Я использовал только блокировку на запись, т.е. по сути точно так же как CRITICAL_SECTION. Блокировку на чтение попробовал использовать в переборе на поиск свободного необработанного (метод lite_actor_t::find_ready()), но стало чуть медленнее. kealon(Ruslan)как то тестили мы раличные реализации RW-локов, там тоже всё не так однозначно, то что хорошо пашет на 10-ке например, тупит на 7-ке, и наоборот Тестил оба на 10-ке. 7-ок не осталось. Но если в целом смотреть, то SRWLOCK выгоднее: функционал CRITICAL_SECTION повторяет (кроме вложенных вызовов внутри потока) и плюсом можно блокировку для чтения задействовать при необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 12:38 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima T, тогда, я бы на твоём месте удивился почему оно быстрее CS или спинлоков (на CAS реализация) тех же, ибо функционал реализованный в SRWLOCK несколько избыточный, например, по сравнению со спинлоком Кроме того основное применение у SRWLOCK - это когда операций чтения значительно больше операций записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 12:56 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima TPS Попробовал SRWLOCK использовать по полной, т.е. сначала блокировка только на чтение, далее при необходимости блокировка на запись. В моем случае не помогло, т.к. при записи надо снять блокировку на чтение, поставить блокировку на запись , перепроверить что не было изменений между снятием и постановкой блокировки. Все эти манипуляции съедают всю экономию от параллельного чтения. Выделенное - это известная особенность в СУБД, т.к. повышение блокировки с разделяемой до эксклюзивной очень сильно повышает вероятность deadlock. Именно по этой причине в стандарте std::shared_mutex не сделали возможность повышения блокировки shared_lock до lock, хотя в boost::shared_mutex эта возможность была. Dima TВычитал у Рихтера что SRWLOCK работает быстрее чем CRITICAL_SECTION. Решил проверить. Затестил на своей библиотеке акторов. Результат в млн. попугаев, т.е. млн. сообщений/сек. Процессор Потоков CSx32 SRWx32 CSx64 SRWx64i7 3770K (4 ядра + HT) DDR3 8 39.5 38.7 39.9 42.2i7 6700K (4 ядра без HT) DDR4 4 30.7 31.2 29.5 29.6 x32/x64 - битность при компиляции. Почти всегда SRWLOCK не хуже. Если кто хочет позапускать Исходники . Компилировать stress_test. Менять: #define CPU_MAX 8 // Количество потоков #define LT_WIN_XP // Вариант с CRITICAL_SECTION Результат смотреть в строке msg_send/sec А какие результаты дают std::mutex C++11 (вместо CRITICAL_SECTION) и std::shared_mutex C++17 (вместо SRWLOCK)? Если нет C++17, то можно использовать shared_timed_mutex C++14 (вместо SRWLOCK). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 13:22 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima T, тогда, я бы на твоём месте удивился почему оно быстрее CS или спинлоков (на CAS реализация) тех же, ибо функционал реализованный в SRWLOCK несколько избыточный, например, по сравнению со спинлоком Спинлоки не рассматриваем, они быстрее только при небольших нагрузках. Я же с них перешел на CS, т.к. спинлок тормозить начал. CS и SRWLOCK хороши тем что после некоторого количества циклов спинлока уходят на ожидание встроенного Event`a, т.е. в режим ядра. CS тоже избыточный, т.к. там возможны вложенные блокировки в пределах одного потока, т.е. он отслеживает поток, который блокировку накладывает, а SRWLOCK - нет. Может с этим связано. Кроме того блокировка чтения-записи достаточно просто реализуется: уменьшить счетчик читающих на 1 если он был 0. Если удалось - блокировка на запись установлена. PS Я бы может тоже удивился, но вычитал я это у Рихтера , он тоже мерил, поэтому решил просто проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 13:25 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Вася УткинА какие результаты дают std::mutex C++11 (вместо CRITICAL_SECTION) и std::shared_mutex C++17 (вместо SRWLOCK)? Если нет C++17, то можно использовать shared_timed_mutex C++14 (вместо SRWLOCK). Дополнил результат Процессор Потоков CSx32 SRWx32 CSx64 SRWx64std::mutex x32std::mutex x64std::shared_mutex x32std::shared_mutex x64i7 3770K (4 ядра + HT) DDR3 8 39.5 38.7 39.9 42.2 25.5 28.8 37.7 43.0 Компилятор MSVC 2015. Второй комп пока под нагрузкой, не могу на нем потестить. std::shared_mutex на x64 оказался быстрее SRWLOCK. Есть над чем подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 14:29 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima TВася УткинА какие результаты дают std::mutex C++11 (вместо CRITICAL_SECTION) и std::shared_mutex C++17 (вместо SRWLOCK)? Если нет C++17, то можно использовать shared_timed_mutex C++14 (вместо SRWLOCK). Дополнил результат Процессор Потоков CSx32 SRWx32 CSx64 SRWx64std::mutex x32std::mutex x64std::shared_mutex x32std::shared_mutex x64i7 3770K (4 ядра + HT) DDR3 8 39.5 38.7 39.9 42.2 25.5 28.8 37.7 43.0 Компилятор MSVC 2015. Второй комп пока под нагрузкой, не могу на нем потестить. std::shared_mutex на x64 оказался быстрее SRWLOCK. Есть над чем подумать. Попробуйте скачать этот файл: https://raw.githubusercontent.com/AlexeyAB/object_threadsafe/master/safe_ptr.h Сделать #include "safe_ptr.h" И использовать default_contention_free_shared_mutex вместо std::shared_mutex, какая производительность будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 14:48 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima T, посоветовал бы ещё спин-лок с разгрукой поюзать, 40 лямов/c на i7 он должен выжимать std::shared_mutex x64 - 43.0, выглядит довольно подозрительно (затормаживает отдельные потоки??? посмотри нагруку на проц) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 14:59 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima TВася УткинА какие результаты дают std::mutex C++11 (вместо CRITICAL_SECTION) и std::shared_mutex C++17 (вместо SRWLOCK)? Если нет C++17, то можно использовать shared_timed_mutex C++14 (вместо SRWLOCK). Дополнил результат Процессор Потоков CSx32 SRWx32 CSx64 SRWx64std::mutex x32std::mutex x64std::shared_mutex x32std::shared_mutex x64i7 3770K (4 ядра + HT) DDR3 8 39.5 38.7 39.9 42.2 25.5 28.8 37.7 43.0 Компилятор MSVC 2015. Второй комп пока под нагрузкой, не могу на нем потестить. std::shared_mutex на x64 оказался быстрее SRWLOCK. Есть над чем подумать. Делаете только lock() или shared_lock() тоже в std::shared_mutex? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 15:15 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Вася УткинДелаете только lock() или shared_lock() тоже в std::shared_mutex? только lock(), т.е. везде монопольная блокировка (как для записи). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 15:18 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima T, посоветовал бы ещё спин-лок с разгрукой поюзать, 40 лямов/c на i7 он должен выжимать Это как? Знаю просто спинлок как сделать. kealon(Ruslan)std::shared_mutex x64 - 43.0, выглядит довольно подозрительно (затормаживает отдельные потоки??? посмотри нагруку на проц) У меня в тесте ограничение на количество потоков по числу ядер. Загрузка 100% на все 10 сек теста. Я вот что подумал: из-за этого у меня ожидания долгого не происходит. Попробую затестить с количеством потоков больше чем ядер. Например 12 потоков на 8 ядрах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 15:41 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
cfreeПопробуйте скачать этот файл: https://raw.githubusercontent.com/AlexeyAB/object_threadsafe/master/safe_ptr.h Сделать #include "safe_ptr.h" И использовать default_contention_free_shared_mutex вместо std::shared_mutex, какая производительность будет? Написал так Код: plaintext 1. 2. Ошибка на второй строке Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 16:01 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima TcfreeПопробуйте скачать этот файл: https://raw.githubusercontent.com/AlexeyAB/object_threadsafe/master/safe_ptr.h Сделать #include "safe_ptr.h" И использовать default_contention_free_shared_mutex вместо std::shared_mutex, какая производительность будет? Написал так Код: plaintext 1. 2. Ошибка на второй строке Код: plaintext 1. Попробуйте так Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 16:50 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Затестил на 12 потоках (8 логических ядер i7 3770K) Блокировка 8 потоков 12 потоков 16 потоковSpin-lock 51.6 34.7 24.6std::shared_mutex 43.0 41.0 40.2SRWLOCK 42.2 40.4CRITICAL_SECTION 39.9 38.3std::mutex 28.9 27.6 Spin-lock исходник Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Spin-lock быстрый, но как только ядра свободные кончаются - все грустно становится. PS Позже затестю std::shared_mutex на втором компе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 16:58 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
cfreeПопробуйте так Код: plaintext 1. 2. 3. 4. Так получилось. Скорость не очень. Стенд тот же 21127862 Блокировка 8 потоков 12 потоков 16 потоковSpin-lock 51.6 34.7 24.6std::shared_mutex 43.0 41.0 40.2default_contention_free_shared_mutex 17.1 11.4 10.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 17:09 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Процессор Потоков CSx32 SRWx32 CSx64 SRWx64std::mutex x32std::mutex x64std::shared_mutex x32std::shared_mutex x64i7 3770K (4 ядра + HT) DDR3 8 39.5 38.7 39.9 42.2 25.5 28.8 37.7 43.0 Dima TВася УткинДелаете только lock() или shared_lock() тоже в std::shared_mutex? только lock(), т.е. везде монопольная блокировка (как для записи). Вообще странно, что на эксклюзивных блокировках std::shared_mutex быстрее, чем std::mutex. Судя по всему большинство времени один и тот же поток каждый раз захватывает блокировку и только изредка отдаёт её другому потоку - большую часть времени фактически получается однопоточное исполнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 18:34 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima T, как-то так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. PS: с Sleep(1) тоже неплохо работает обычно, но как всегда есть ньюансы.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 18:43 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Вася УткинВообще странно, что на эксклюзивных блокировках std::shared_mutex быстрее, чем std::mutex. Судя по всему большинство времени один и тот же поток каждый раз захватывает блокировку и только изредка отдаёт её другому потоку - большую часть времени фактически получается однопоточное исполнение. во ..., это объясняет почему больше предела выходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 18:48 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Результат второго компа: в x32 shared_mutex самый медленный, в x64 самый быстрый Процессор Потоков CSx32 SRWx32std::shared_mutex x32 SRWx64 CSx64std::shared_mutex x64i7 3770K (4 ядра + HT) DDR3 8 39.5 38.7 37.7 39.9 42.2 43.0i7 6700K (4 ядра без HT) DDR4 4 30.7 31.2 29.7 29.5 29.6 30.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 18:59 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Вася УткинВообще странно, что на эксклюзивных блокировках std::shared_mutex быстрее, чем std::mutex. Судя по всему большинство времени один и тот же поток каждый раз захватывает блокировку и только изредка отдаёт её другому потоку - большую часть времени фактически получается однопоточное исполнение. во ..., это объясняет почему больше предела выходит Чем тогда объясните 100% загрузки проца в диспетчере? Все восемь ядер под завязку. Я уже писал об этом 21127347 Задача искусственная, можно запросто хоть 100 ядер загрузить, суть в начале описана . Если кто дальше не верит - исходники открыты, могу написать что подправить для запуска с использованием std::shared_mutex PS Спинлок со Sleep() позже испытаю. Для подобных целей есть спец. функция в WinAPI, которая в отличии от слипа отдает остатки неизрасходованного времени другому потоку своего же процесса. Как называется - забыл, у Рихтера было, сейчас полистаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 19:12 |
|
||
|
Тест производительности: CRITICAL_SECTION и SRWLOCK
|
|||
|---|---|---|---|
|
#18+
Dima Tkealon(Ruslan)пропущено... во ..., это объясняет почему больше предела выходит Чем тогда объясните 100% загрузки проца в диспетчере? Все восемь ядер под завязку. Я уже писал об этом 21127347 Задача искусственная, можно запросто хоть 100 ядер загрузить, суть в начале описана . Если кто дальше не верит - исходники открыты, могу написать что подправить для запуска с использованием std::shared_mutex PS Спинлок со Sleep() позже испытаю. Для подобных целей есть спец. функция в WinAPI, которая в отличии от слипа отдает остатки неизрасходованного времени другому потоку своего же процесса. Как называется - забыл, у Рихтера было, сейчас полистаю. наверное пытаются занять спин-лок SwitchToThread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2018, 19:18 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39588025&tid=2017987]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 186ms |

| 0 / 0 |
