Russian Qt Forum
Ноябрь 23, 2024, 20:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QAtomicInt vs. QMutex  (Прочитано 16446 раз)
once_again_abc
Гость
« : Сентябрь 09, 2011, 04:43 »

Что быстрее - обращение к переменной через QMutex.lock/unlock или к переменной типа QAtomicInt через testAndSetRelaxed?
Записан
brankovic
Гость
« Ответ #1 : Сентябрь 09, 2011, 09:45 »

В лучшем для мьютекса случае обращение через test_and_set 'быстрее' в 2 раза (в мьютексе выполнится минимум 2 test_and_set независимо от реализации, но в не-линуксах может быть и больше). В худшем случае мьютекс  может быть сколь угодно медленнее. Но это большая и сложная тема, 'быстрее' тут почти бессмысленное понятие.
« Последнее редактирование: Сентябрь 09, 2011, 11:29 от brankovic » Записан
once_again_abc
Гость
« Ответ #2 : Сентябрь 09, 2011, 11:02 »

В лучшем случае для мьютекса обращение через test_and_set 'быстрее' в 2 раза (в мьютексе выполнится минимум 2 test_and_set независимо от реализации, но в не-линуксах может быть и больше). В худшем случае мьютекс  может быть сколь угодно медленнее. Но это большая и сложная тема, 'быстрее' тут быстрее почти бессмысленное понятие.

есть общие практики использования того и другого? каковы критерии выбора в зависимости от ситуации?
Записан
brankovic
Гость
« Ответ #3 : Сентябрь 09, 2011, 11:14 »

Правило номер 1: никогда не используйте атомарные операции
Правило номер 2: никогда не используйте атомарные операции
Правило номер 3: в реальном проекте за использование атомарных операций отрубают руки по локоть

Если серьёзно, то пару раз видел очень эффективное использования кода на атомиках, но 1. код не простой, 2. убедить коллег что имеет смысл с этим связываться ещё сложнее. Короче использовать надо только если вы точно знаете, что это что-то даст, например если треды много времени ждут в локах.

Кстати, ваш другой давешний вопрос про QSettings тоже можно решить атомиками, но решение с read-write локерами всё же предпочтительнее из-за простоты и наглядности.
« Последнее редактирование: Сентябрь 09, 2011, 11:18 от brankovic » Записан
once_again_abc
Гость
« Ответ #4 : Сентябрь 09, 2011, 11:36 »

Правило номер 1: никогда не используйте атомарные операции
Правило номер 2: никогда не используйте атомарные операции
Правило номер 3: в реальном проекте за использование атомарных операций отрубают руки по локоть

как-то несерьезно. чем обоснованны эти правила?

Если серьёзно, то пару раз видел очень эффективное использования кода на атомиках, но 1. код не простой, 2. убедить коллег что имеет смысл с этим связываться ещё сложнее. Короче использовать надо только если вы точно знаете, что это что-то даст, например если треды много времени ждут в локах.

не понял ваш "например". не могли бы пояснить, что вы здесь имели ввиду?
Записан
brankovic
Гость
« Ответ #5 : Сентябрь 09, 2011, 11:57 »

как-то несерьезно. чем обоснованны эти правила?

правила получены опытным путём. Обычно реализация даже простого алгоритма (например обычный стек) на атомиках занимает много времени и тянет за собой шлейф трудно исправимых багов.

Сравнение atomic vs. locks сводится к следующему: мьютексы использовать проще, атомики потенциально эффективнее. Дальше следует выяснить насколько эффективнее. Оказывается не сильно, скажем ускорение на 50% в специфических местах может дать 5 или 1% для всей программы. А сложность алгоритмов на атомарных операциях буквально в разы больше. На поддержку такого кода обычно нет ресурсов. Это с точки зрения бизнеса. Теперь с вашей личной точки зрения. Допустим вы убьёте 2 недели на ускорение программы на 1%, оно вам надо? Как правило нет.

Edit: но есть конечно implicit sharing, shared_ptr и прочие полезные вещи, которые без атомиков не реализуешь. Обычно их кто-то до вас уже реализовал, нужно просто воспользоваться.

например если треды много времени ждут в локах.
не понял ваш "например". не могли бы пояснить, что вы здесь имели ввиду?

Если в приложении есть мьютексы-боттлнеки, т.е. места где много тредов ждут один тред захвативший мьютекс или просто очень часто треды 'сталкиваются' (т.е. засыпают из-за занятости мьютекса). Находятся такие проблемы как профилированием, так и умозрительно, поскольку профилировать такое не всегда получается.
« Последнее редактирование: Сентябрь 09, 2011, 18:07 от brankovic » Записан
once_again_abc
Гость
« Ответ #6 : Сентябрь 09, 2011, 12:35 »

...

Спасибо!  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Сентябрь 09, 2011, 13:09 »

..поскольку профилировать такое не всегда получается.
Ну вот зачем так на самое больное место?   Улыбающийся

как-то несерьезно. чем обоснованны эти правила?
Спасибо!  Улыбающийся
Вы немного поэкспериментируйте, и, возможно, после этого ответы Вам уже не покажутся странными/смешными. Возьмите просто вектор, заполните его и запустите 10 ниток которые только и делают что пишут в этот вектор под защитой прекрасной, удобной конструкции напр так
Код
C++ (Qt)
QMutexLocker locker(&theMutex);
theVector[0] = 1;
 
И посмотрите что у Вас со скоростью - а потом, если будет желание, обсудим и atomic.
А если у Вас не найдется 15 минут чтобы это проверить  - ну значит и разговор несерьезный  Улыбающийся
Записан
Akon
Гость
« Ответ #8 : Сентябрь 09, 2011, 17:56 »

Есть задачи, где без атомиков очень плохо, например, подсчет ссылок, а в целом согласен с brankovic.
« Последнее редактирование: Сентябрь 09, 2011, 17:58 от Akon » Записан
once_again_abc
Гость
« Ответ #9 : Сентябрь 14, 2011, 03:06 »

да, кьютишные семафоры и мьютексы довольно медленная штука.
использовал QAtomicInt + QAtomicPointer для неблокирующего кольцевого буфера в консьюмер-продюсер алгоритме.
Записан
BRE
Гость
« Ответ #10 : Сентябрь 14, 2011, 07:18 »

да, кьютишные семафоры и мьютексы довольно медленная штука.
Нет никаких "кьютишные семафоры и мьютексы"! Эти классы в Qt всего лишь врапперы над системными объектами.
Записан
once_again_abc
Гость
« Ответ #11 : Сентябрь 14, 2011, 08:08 »

да, кьютишные семафоры и мьютексы довольно медленная штука.
Нет никаких "кьютишные семафоры и мьютексы"! Эти классы в Qt всего лишь врапперы над системными объектами.


я в курсе и это вообще то очевидно. зачем об этом говорить, да еще так(!) эмоционально? =)
Записан
BRE
Гость
« Ответ #12 : Сентябрь 14, 2011, 08:58 »

я в курсе и это вообще то очевидно. зачем об этом говорить, да еще так(!) эмоционально? =)
Потому что уже надоело читать про тормозящие кьютешные треды, мьютексы и сокеты. Подмигивающий

Насчет мьютексов... если их сравнивать с атомарными операциями, то они всегда будут медленней последних, но и задачи они выполняют разные.
Задачу можно постараться решить так, что бы время ожидания на объектах синхронизации было минимально и им можно было просто пренебречь.
Вот для примера, если посмотреть на то, что предлагает проверить Igors в посте # 7. Время расчета значения в каждом треде соизмеримо (в этом случае даже меньше) с временем помещения этого значения в вектор. Тут и пробовать ничего не надо, и так понятно что все нитки кроме одной будут просто ждать на мьютексе и мы получим не ускорение, а заметные тормоза.
Но если изменить алгоритм и каждой нитке указать диапазон вектора для заполнения, то они все сразу заработают параллельно не мешая друг другу (да и объекты синхронизации уже не понадобятся). Или каждая нитка может заполнить свой внутренний вектор порцией данных, а мотом под защитой мьютекса добавить его в общий вектор и вернутся к заполнению внутреннего.
В общем нужно стараться, что бы нитки больше работали и меньше взаимодействовали. Улыбающийся
Записан
BRE
Гость
« Ответ #13 : Сентябрь 14, 2011, 09:11 »

И да, я не противник атомарных операций, при возможности с удовольствием пользую. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 14, 2011, 09:52 »

Насчет мьютексов... если их сравнивать с атомарными операциями, то ..
Мутекс блокирует нитки, атомарные операции нет, эти вещи не взаимозаменяемы. Поэтому их сравнение бессмысленно, как и название топика.  

Вот для примера, если посмотреть на то, что предлагает проверить Igors в посте # 7. Время расчета значения в каждом треде соизмеримо (в этом случае даже меньше) с временем помещения этого значения в вектор. Тут и пробовать ничего не надо, и так понятно что все нитки кроме одной будут просто ждать на мьютексе и мы получим не ускорение, а заметные тормоза.
Вот пока "и так все ясно" (т.е. не проверено, не прочувствовано на опыте) - толку никакого  Улыбающийся
Насколько (во сколько раз) время расчета должно быть больше, чтобы мутекс на общем контейнере работал удовлетворительно? (напр 4 нитки, требуемый КПД хотя бы 300%). Что выигрывается с QReadWriteLocker  (напр соотношение 3 чтения и 1 запись)?  Но я так вижу это неинтересно проверять. Куда проще что-то прочитать/услышать и поддержать разговор напр так
да, кьютишные семафоры и мьютексы довольно медленная штука.
Улыбающийся

Но если изменить алгоритм и ..
Ну так это может быть очень недешево (с точки зрения написания)

Возвращаясь к теме - плохо что Qt имеет только "честный" мутекс (fair mutex). Во многих случаях удается успешно проскочить с нечестным (unfair который не останавливает нитку) вместо дорогостоящей переделки алгоритма.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.093 секунд. Запросов: 22.