|
Насчёт синхронизируемого объекта - lock(synchObject)
|
|||
---|---|---|---|
#18+
AlexUser987Result делает слепок с набора результатов и потом сразу "освобождает" (в смысле, что перестаёт использовать - считывать значения там и прочее) этот набор, чтобы Calc дальше мог в него писать. В момент создания слепка я и применяю блокировку через lock. ИМХУ тут обратно надо. Calc делает слепок и отдает его, тогда блокировок не надо. Опять же вопрос как часто это надо? Например если Result() обрабатывает только каждый тысячный слепок, то будет лишний тормоз. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 19:22 |
|
Насчёт синхронизируемого объекта - lock(synchObject)
|
|||
---|---|---|---|
#18+
Dima TИМХУ тут обратно надо. Calc делает слепок и отдает его, тогда блокировок не надо. Т. е. тот, кто считает, тот же и слепок делает? Да в принципе не важно, по-моему, кто там чего делает - Calc, Result или ещё какие сущности. Я просто примерно раскидал задачи по классам. Можно всё и в один класс запихать, а можно и ещё разделить. Или я вас не понял. Важно, что есть одновременный доступ к результатам расчёта из разных потоков. Потому что вот эти вещи 1) расчёт, 2) сохранение результатов в переменных в ОЗУ в процессе расчёта, 3) создание слепка из результатов, 4) вывод слепка результатов на экран должны быть как можно больше независимы друг от друга. У меня раньше было без слепка. Т. е. на протяжении всего расчёта данные писались в набор результатов под локом, и класс Result не мог получить к ним доступ, чтобы вывести результаты на экран. Когда же получал, то выводил именно результаты (пункт 2), а не слепок. Расчёт длится гораздо дольше создания слепка результатов. Поэтому, когда я ввёл слепок, я смог больше распараллелить всю работу, т. к. теперь, фактически, локи работали только в моменты создания слепка. Вообще без локов, на мой взгляд - только если накапливать весь набор результатов в коллекцию наборов результатов. И потом Result будет брать самый последний добавленный набор результатов (банально проверяем свойство Count без всяких локов, и берём текущее последнее значение). Ну, я уже об этом раньше писал. Я так думаю. Arm79AlexUser987, Элементов в наборе данных много? десятки? сотни? тысячи? миллионы? В смысле элементов? Число коллекций, объектов, значений? Или вплоть до числа элементов в каждой коллекции? Если первое, то 20-100. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 20:46 |
|
Насчёт синхронизируемого объекта - lock(synchObject)
|
|||
---|---|---|---|
#18+
AlexUser987В смысле элементов? Число коллекций, объектов, значений? Или вплоть до числа элементов в каждой коллекции? Если первое, то 20-100. Коллекций до 100? А в каждой коллекции сколько элементов? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 23:42 |
|
Насчёт синхронизируемого объекта - lock(synchObject)
|
|||
---|---|---|---|
#18+
Arm79AlexUser987В смысле элементов? Число коллекций, объектов, значений? Или вплоть до числа элементов в каждой коллекции? Если первое, то 20-100. Коллекций до 100? А в каждой коллекции сколько элементов? Нет. Коллекций штук 10-20. Плюс несколько десятков строковых и числовых переменных, собранных в разные объекты. Коллекции есть разные. Есть, где в принципе 1-10 элементов и больше навряд ли будет. А есть, где 100-10000. Да и я сейчас стараюсь переработать, чтобы не более 2000-3000 было. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2015, 07:32 |
|
Насчёт синхронизируемого объекта - lock(synchObject)
|
|||
---|---|---|---|
#18+
AlexUser987Dima TИМХУ тут обратно надо. Calc делает слепок и отдает его, тогда блокировок не надо. Т. е. тот, кто считает, тот же и слепок делает? Да AlexUser987Да в принципе не важно, по-моему, кто там чего делает - Calc, Result или ещё какие сущности. Я просто примерно раскидал задачи по классам. Можно всё и в один класс запихать, а можно и ещё разделить. Или я вас не понял. Важно, что есть одновременный доступ к результатам расчёта из разных потоков. Потому что вот эти вещи 1) расчёт, 2) сохранение результатов в переменных в ОЗУ в процессе расчёта, 3) создание слепка из результатов, 4) вывод слепка результатов на экран должны быть как можно больше независимы друг от друга. Определись уже важно или нет. Если слепок делает Result то он должен остановить Calc, следовательно Calc должен регулярно проверять блокировку, что тоже ресурсы потребляет. Если слепок делает Calc, то ему не надо проверять блокировки, он просто сделал новый слепок, отдал на него ссылку и больше этот слепок не трогает. Чтобы отдать ссылку синхронизации не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2015, 08:33 |
|
Насчёт синхронизируемого объекта - lock(synchObject)
|
|||
---|---|---|---|
#18+
Dima TЕсли слепок делает Calc, то ему не надо проверять блокировки, он просто сделал новый слепок, отдал на него ссылку и больше этот слепок не трогает. Чтобы отдать ссылку синхронизации не надо. Да, не надо. Просто, по-вашему, Calc будет после каждой итерации расчёта слепки делать в том же потоке, вместо того, чтобы заниматься новой итерацией. Я вас правильно понял? У меня логика такая, что Result сам запрашивает/делает слепок. Т. е. Calc должен только молотить расчёт. В принципе, если Result не запросит ни разу результат для отображения, то Calc так и домолотит до конца и оставит в переменных результатов последний вариант результатов. Это я сделал для того, чтобы легко было приспособить всю схему под клиент-сервер. Когда сервер только считает, но не оповещает клиента, что закончилась очередная итерация расчёта. Вместо этого сам клиент запрашивает сервер в цикле и, если новая итерация закончилась, то получает слепок. При этом неважно, какой класс делает слепок на стороне сервера - сам Calc или специально созданный для этого класс. Вот это я имел ввиду, говоря авторДа в принципе не важно, по-моему, кто там чего делает - Calc, Result или ещё какие сущности А насчёт этого авторэти вещи 1) расчёт, 2) сохранение результатов в переменных в ОЗУ в процессе расчёта, (у меня объединено с 1) 3) создание слепка из результатов, 4) вывод слепка результатов на экран должны быть как можно больше независимы друг от друга. я имел ввиду по потокам. Т. е. вышеперечисленные пункты должны выполняться в разных потоках. Но при этом код этих пунктов может быть где угодно - хоть в одном классе, хоть в разных - это просто методы классов. И вот в клиент-серверном варианте я сделал как вы сказали - у меня метод, делающий слепок, находится в классе Calc (исторически сложилось - ещё не разбил свой god-class на части). Класс Result находится на клиенте. Да, в принципе, и в локальном варианте то же самое - просто библиотеку расчёта я перенёс из веб-сервиса на клиент и принцип работы не изменился - Result запрашивает Calc о новых результатов и просит сделать слепок. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2015, 15:34 |
|
Насчёт синхронизируемого объекта - lock(synchObject)
|
|||
---|---|---|---|
#18+
Я, наверное, вас запутал. Потому что хотел задать простой вопрос, а реальная ситуация у меня сложнее. Пришлось наворачивать и наворачивать по мере обсуждения. Вобщем, я достаточно просветился, спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2015, 15:35 |
|
|
start [/forum/topic.php?fid=20&gotonew=1&tid=1400964]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
10ms |
get first new msg: |
14ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 154ms |
0 / 0 |