Firebase - приложение долго не отвечает (из-за синхронизации данных?)

Я не думаю, что есть лучший человек, чтобы ответить на это, чем Эрик Липперт (выделение в оригинале):

В C # "volatile" означает не только «убедитесь, что компилятор и джиттер не выполняют каких-либо переупорядочений кода или оптимизируют кэширование регистров для этой переменной». Это также означает, что «попросите процессоры сделать то, что им нужно, чтобы убедиться, что я читаю последнее значение, даже если это означает остановить другие процессоры и заставить их синхронизировать основную память с их кешами».

Собственно, последний бит - ложь. Истинная семантика неустойчивых чтений и записей значительно сложнее, чем я здесь изложил; на самом деле они фактически не гарантируют, что каждый процессор останавливает то, что он делает, и обновляет кеши в / из основной памяти. Скорее, они обеспечивают более слабые гарантии того, как доступ к памяти до и после чтения и записи может наблюдаться для упорядочения друг относительно друга. Некоторые операции, такие как создание нового потока, ввод блокировки или использование одного из методов семейства блокировок, обеспечивают более надежные гарантии наблюдения за порядком. Если вы хотите получить более подробную информацию, прочитайте разделы 3.10 и 10.5.3 спецификации C # 4.0.

Честно говоря, я препятствую вам когда-либо создавать поле volatile. Неустойчивые поля являются признаком того, что вы делаете что-то совершенно безумное: вы пытаетесь читать и писать одно и то же значение на двух разных потоках, не помещая блокировку на место. Замки гарантируют, что память, считываемая или измененная внутри замка, будет последовательной, блокировки гарантируют, что только один поток обращается к заданному блоку памяти за раз и так далее. Количество ситуаций, в которых блокировка слишком медленная, очень мала, и вероятность того, что вы собираетесь получить код неправильно, потому что вы не понимаете, что точная модель памяти очень велика. Я не пытаюсь написать код с низким уровнем блокировки, за исключением самых простых операций блокировки. Я оставляю использование «изменчивых» для реальных экспертов.

blockquote>

Для дальнейшего чтения см .:

0
задан NSCoder 20 March 2019 в 00:37
поделиться

1 ответ

Вы не можете реально предотвратить синхронизацию данных, когда Firebase SDK находится в сети. Если у вас большая ожидающая запись, это займет столько времени, сколько потребуется, чтобы завершить, и будет блокировать другие записи, пока она не закончится.

Вместо этого вы можете собирать данные в другое хранилище (локальный файл или базу данных) вместо прямой записи в базу данных с помощью SDK. Затем вы можете выбрать, когда эти данные будут, наконец, записаны в базу данных реального времени (но это все равно займет столько же времени)

.
0
ответ дан Doug Stevenson 20 March 2019 в 00:37
поделиться