|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
Например имеем Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Т.е. Dictionary периодически заполняется (кэш справочника из БД) и сохраняется в list, далее никаких изменений Dictionary, только чтение. Fill() и Get() вызываются из разных потоков. Может прога аварийно завершиться если не указать volatile ? Мне кажется что нет, но есть сомнения. Как понимаю реально list это ссылка на объект (переменная с адресом объекта), которая перезаписывается при list = tmp. Как понимаю присвоение это одна команда асма, т.е. все атомарно произойдет независимо от volatile, а volatile просто запрещает какое-либо кэширование ссылки оптимизатору. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 10:10 |
|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
Dima TКак понимаю присвоение это одна команда асма, т.е. все атомарно произойдет независимо от volatileЭто да. Dima Tа volatile просто запрещает какое-либо кэширование ссылки оптимизатору.Запрещает кэширование значения переменной в кэше CPU. Если не поставить volatile, то при наличии нескольких CPU, каждый со своим кэшем, второй поток может работать с предыдущим объектом Dictionary несмотря на то, что первый поток записал в переменную list новое значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 10:50 |
|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
volatile не нужен Код подозрительный, но если ты гарантируешь, что Fill() два раза одновременно не вызывается, и что Get() вызовется после того, как отработает Fil(), то и ладно. Но все же синхронизацию я бы впилил ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 10:54 |
|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
Dima T, 1. volatile тебе тут не надо. 2. открой для себя Класс ConcurrentDictionary<TKey, TValue> 3. открой для себя Класс Lazy<T> 4. тебе в данном случае больше подойдет lock и аналоги, хотя последние лучше применять съев на том собаку 5. такое кеширование иногда может быть медленнее чтения каждый раз из БД, сравни производительность 2 вариантов 6. для общего развития почитай по теме memoization, можно раз и навсегда написав несколько методов кешировать легким движением руки все, что угодно (я так и делаю : )) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 10:58 |
|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
Алексей КЕсли не поставить volatile, то при наличии нескольких CPU, каждый со своим кэшем, второй поток может работать с предыдущим объектом Dictionary несмотря на то, что первый поток записал в переменную list новое значение. Собственно поэтому и не хочу писать. Тут замеры проводил . PallarisКод подозрительный, но если ты гарантируешь, что Fill() два раза одновременно не вызывается Fill() потокобезопасный. Заполняется локальный Dictionary. ЕвгенийВ2. открой для себя Класс ConcurrentDictionary<TKey, TValue> 3. открой для себя Класс Lazy<T> 4. тебе в данном случае больше подойдет lock и аналоги, хотя последние лучше применять съев на том собаку 5. такое кеширование иногда может быть медленнее чтения каждый раз из БД, сравни производительность 2 вариантов 6. для общего развития почитай по теме memoization, можно раз и навсегда написав несколько методов кешировать легким движением руки все, что угодно (я так и делаю : )) ConcurrentDictionary в разы тормознее. Да и не нужен он. Как и прочие блокировки. Нужен Dictionary в режиме readonly. Прога автономно работать будет. БД далеко в инете, связь может пропадать и т.д. и т.п. Достаточно обновления раз в час. Почитал про memoization , это по сути оно и есть, только не записями, а сразу таблицей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 12:00 |
|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
Dima T, Зная тебя как фанатичного маньяка перфоманса, могу еще порекомендовать следующее. Если, как в твоем случае, нужен ридонли словарь, можно прибегнуть к динамическим кодогенерации и компиляции. Например твой словарь можно описать примерно так. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Компилятор C# же, трансформирует это в Код: c# 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. 31. 32.
То есть никаких тебе хешфункций и прочей внутренней кухни Dictionary<UInt64, Int32>, минимум действий для получения результата. Си с плюсами, со всеми его STL и Boost нервненько курит в сторонке. P. S. как создать и подгрузить динамическую сборку разберешся? P. P. S. давно хочу замутить такой словарик, да все лень. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 12:36 |
|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
ЕвгенийВDima T, Зная тебя как фанатичного маньяка перфоманса, могу еще порекомендовать следующее. Если, как в твоем случае, нужен ридонли словарь, можно прибегнуть к динамическим кодогенерации и компиляции. В моем случае это не подойдет, т.к. записей под миллион, т.е. исходник на 1 млн. строк ... я не на столько маньяк :) Можно сделать массив структур {UInt64 key, Int32 value}, отсортировать по key и искать Array.BinarySearch() ИМХО тоже самое что твой switch(). Потом затестю. Так еще память экономится. switch() был бы быстрее массива, если бы key имели близкие значения, т.к. при этом дерево if`ов заменяется таблицей переходов 17655427 , правда это в С/С++, но в C# возможно также. Но это не мой случай, т.к. key это хэш. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 13:24 |
|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
[quot Dima T]ЕвгенийВВ моем случае это не подойдет, т.к. записей под миллион, т.е. исходник на 1 млн. строк ... я не на столько маньяк :) Думаешь компилятор не справиться? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 15:29 |
|
Нужно писать volatile для ссылочных полей?
|
|||
---|---|---|---|
#18+
ЕвгенийВДумаешь компилятор не справиться? :) Справится наверно, но раз в час генерить такой исходник, компилировать, гонять по инету, компиляция IL-кода при первом обращении... Изврат какой-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2017, 15:48 |
|
|
start [/forum/topic.php?fid=20&msg=39449488&tid=1399919]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
165ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 258ms |
0 / 0 |