Здравствуйте, igor-booch, Вы писали:
IB>Это что меняет суть вопроса? Зачем метод AcquireLocks для эксклюзивной блокировки (если она действительно эксклюзивная, как утверждает samius), если эксклюзивную блокировку можно написать как Monitor.Enter(_syncObject)?
Она действительно эксклюзивная, даже если вызывается внутри метода AcquireLocks. Читайте документацию Monitor.Enter.
Re[7]: ConcurrentDictionary не дает выгоды в производительности
Здравствуйте, igor-booch, Вы писали:
IB> Зачем метод AcquireLocks для эксклюзивной блокировки (если она действительно эксклюзивная, как утверждает samius), если эксклюзивную блокировку можно написать как Monitor.Enter(_syncObject)?
Так захватить-то нужно те же локи, что используются при частичной блокировке. Просто все.
Re[10]: ConcurrentDictionary не дает выгоды в производительности
S>Расширение BCL для своего алгоритма? Интересно. А что такого может понадобиться от BCL, чего нельзя написать самому?
То что потребуется в алгоритме, но для чего не будет явной реализации в BCL. Это к тому что S>Сомневаюсь что есть какое-то доказательство для текущего кода из BCL.
Если нет для текущего значит, нужно расширить. А чтобы понять какие расширения нужны, нужен алгоритм.
Хотя действительно вряд ли расширения понадобятся. При реализации словаря ничего такого сложно плохо формализуемого из BCL понадобиться не должно, только базовые структура данных и операции. Вот что может понадобиться, так это разработка математической теории под это дело, или расширение существующих. Но я не уверен, не специалист. Наверняка параллельные алгоритмы должны быть хорошо изучены. Поэтому я и говорю, это сложная научная задача, судя по тому что других сторонних реализаций нет ни одной. Я по крайней мере не встречал.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[8]: ConcurrentDictionary не дает выгоды в производительности
IB>>Это что меняет суть вопроса? Зачем метод AcquireLocks для эксклюзивной блокировки (если она действительно эксклюзивная, как утверждает samius), если эксклюзивную блокировку можно написать как Monitor.Enter(_syncObject)? S>Она действительно эксклюзивная, даже если вызывается внутри метода AcquireLocks. Читайте документацию Monitor.Enter.
Конечно можно внутри AcquireLocks вызвать Monitor.Enter(_syncObject). Но метод называется AcquireLocks, а не AcquireExclusiveLock. Могу предположить, что в итоге действительно получается некая эксклюзивная блокировка, только не на уровне всего экземпляра класса, а на каком-то другом, более узком уровне для увеличения выгоды от увеличения числа потоков.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[11]: ConcurrentDictionary не дает выгоды в производительности
Здравствуйте, igor-booch, Вы писали:
S>>Расширение BCL для своего алгоритма? Интересно. А что такого может понадобиться от BCL, чего нельзя написать самому?
IB>То что потребуется в алгоритме, но для чего не будет явной реализации в BCL. Это к тому что S>>Сомневаюсь что есть какое-то доказательство для текущего кода из BCL. IB>Если нет для текущего значит, нужно расширить. А чтобы понять какие расширения нужны, нужен алгоритм.
google-> lockfree hashtable
IB>Поэтому я и говорю, это сложная научная задача, судя по тому что других сторонних реализаций нет ни одной. Я по крайней мере не встречал.
Я думаю что скорее это никому не надо.
Re[9]: ConcurrentDictionary не дает выгоды в производительности
Здравствуйте, igor-booch, Вы писали:
S>>Она действительно эксклюзивная, даже если вызывается внутри метода AcquireLocks. Читайте документацию Monitor.Enter.
IB>Конечно можно внутри AcquireLocks вызвать Monitor.Enter(_syncObject). Но метод называется AcquireLocks, а не AcquireExclusiveLock. Могу предположить, что в итоге действительно получается некая эксклюзивная блокировка, только не на уровне всего экземпляра класса, а на каком-то другом, более узком уровне для увеличения выгоды от увеличения числа потоков.
Я вам об этом и написал ранее. Только GrowTable берет действительно эксклюзивную, т.к. передает всегда один и тот же индекс — 0.
Re[8]: ConcurrentDictionary не дает выгоды в производительности
P>Так захватить-то нужно те же локи, что используются при частичной блокировке. Просто все.
Точно! только можно было ReadWriteLock использовать.
private ReadWriteLock _exclusiveReadWriteLock;
Частичные блокировки запрашивают _exclusiveReadWriteLock.AcquireReaderLock, а для в реализации AcquireLocks тогда просто _exclusiveReadWriteLock.AcquireWriterLock
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[12]: ConcurrentDictionary не дает выгоды в производительности
S>google-> lockfree hashtable
Ну и где хоть одна реализация для NET?
То что что такие структуры данных не нужны никому сомневаюсь, количество ядер на процах давно перевалило за 1.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[9]: ConcurrentDictionary не дает выгоды в производительности
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[13]: ConcurrentDictionary не дает выгоды в производительности
Здравствуйте, igor-booch, Вы писали:
S>>google-> lockfree hashtable IB>Ну и где хоть одна реализация для NET?
Вы спросили про алгоритм, я ответил именно на это.
IB>То что что такие структуры данных не нужны никому сомневаюсь, количество ядер на процах давно перевалило за 1.
Никому из дотнетчиков не нужны настолько что бы писать свою реализацию для дотнета.
Может и написал кто, да не выложил.
Да я и не очень представляю, за счет чего должен быть выигрышь в куче потоков. Там же RMW операции, они долгие по своей природе. В десятки (или более) раз тормознее обычных на кэше.
Re: ConcurrentDictionary не дает выгоды в производительности
Вообще для улучшения производительности, можно Хэш таблицу Разделить например на 1) хэш таблиц. Учитывая что данных будет много.
Тогда Доступ к каждой можно сделать как поз=Хэш % 10. Если хэши хорошо перемешаны вероятность доступа из двух потоков к одной хэш таблицы будет как 1/10, и соответсвенно уменьшится время ожидания на вставку изменения.
и солнце б утром не вставало, когда бы не было меня
Re[10]: ConcurrentDictionary не дает выгоды в производительности
IB>Хотя с таким подходом будет медленнее чем у них
А может и нет, наверное это долго много раз вызывать Monitor.Enter()
Может быстрее будет _exclusiveReadWriteLock.AcquireWriterLock
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[3]: ConcurrentDictionary не дает выгоды в производительности
I>Теперь сделай ровно тот же тест, но на большом количестве потоков для Dicionary
Не для этого тест, я хочу выбрать делать ли мне многопоточный вариант или однопоточный.
Тест показывает, что быстрее будет однопоточный.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[3]: ConcurrentDictionary не дает выгоды в производительности
Здравствуйте, igor-booch, Вы писали:
I>>Теперь сделай ровно тот же тест, но на большом количестве потоков для Dicionary
IB>Не для этого тест, я хочу выбрать делать ли мне многопоточный вариант или однопоточный. IB>Тест показывает, что быстрее будет однопоточный.
А сценарии у тебя какие ? Итерации не нужны, удаление не нужно ?
Re[4]: ConcurrentDictionary не дает выгоды в производительности
IB>Здесь однозначно побеждает СoncurrentDictionary. I>Правильно, и это именно то ради чего нужен СoncurrentDictionary.
Я не отрицаю, по Вашему мнению Ваша реплика что-то новое привносит?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[4]: ConcurrentDictionary не дает выгоды в производительности
I>А сценарии у тебя какие ? Итерации не нужны, удаление не нужно ?
Сценарий у меня добавить элементы в словарь за максимально короткое время
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re[5]: ConcurrentDictionary не дает выгоды в производительности
S>Вообще для улучшения производительности, можно Хэш таблицу Разделить например на 1) хэш таблиц. Учитывая что данных будет много. S>Тогда Доступ к каждой можно сделать как поз=Хэш % 10. Если хэши хорошо перемешаны вероятность доступа из двух потоков к одной хэш таблицы будет как 1/10, и соответсвенно уменьшится время ожидания на вставку изменения.
Если ключ был к примеру int, так можно было бы сделать.
К сожалению этот вариант для меня не подходит так тип ключа мне неизвестен, для меня он object.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml