Ответ 1
ОБНОВЛЕНИЕ: 15 ноября 2017 г. - iOS Firestore SDK v0.9.2
Кажется, что проблема с медленной производительностью теперь исправлена. Я повторно запускаю тесты, описанные ниже, и время, которое требуется для того, чтобы Firestore вернул 100 документов, похоже, постоянно составляет около 100 мс.
Не уверен, что это было исправление в последнем SDK v0.9.2, или если это исправление для бэкэнд (или и то, и другое), но я предлагаю всем обновить свои модули Firebase. Мое приложение заметно более отзывчивое - похоже на то, как оно было в базе данных реального времени.
Я также обнаружил, что Firestore намного медленнее, чем БД Realtime, особенно при чтении из большого количества документов.
Обновленные тесты (с последним iOS Firestore SDK v0.9.0):
Я установил тестовый проект в iOS Swift с использованием как RTDB, так и Firestore и выполнил по 100 последовательных операций чтения для каждого. Для RTDB я протестировал функцию observSingleEvent и наблюдал методы на каждом из 100 узлов верхнего уровня. Для Firestore я использовал методы getDocument и addSnapshotListener в каждом из 100 документов в коллекции TestCol. Я запускал тесты с постоянным диском. Пожалуйста, обратитесь к прилагаемому изображению, которое показывает структуру данных для каждой базы данных.
Я провел тест 10 раз для каждой базы данных на одном устройстве и стабильной сети Wi-Fi. Существующие наблюдатели и слушатели были уничтожены перед каждым новым прогоном.
Метод наблюдения в режиме реального времени DBSignSingleEvent:
func rtdbObserveSingle() {
let start = UInt64(floor(Date().timeIntervalSince1970 * 1000))
print("Started reading from RTDB at: \(start)")
for i in 1...100 {
Database.database().reference().child(String(i)).observeSingleEvent(of: .value) { snapshot in
let time = UInt64(floor(Date().timeIntervalSince1970 * 1000))
let data = snapshot.value as? [String: String] ?? [:]
print("Data: \(data). Returned at: \(time)")
}
}
}
Метод наблюдения в режиме реального времени:
func rtdbObserve() {
let start = UInt64(floor(Date().timeIntervalSince1970 * 1000))
print("Started reading from RTDB at: \(start)")
for i in 1...100 {
Database.database().reference().child(String(i)).observe(.value) { snapshot in
let time = UInt64(floor(Date().timeIntervalSince1970 * 1000))
let data = snapshot.value as? [String: String] ?? [:]
print("Data: \(data). Returned at: \(time)")
}
}
}
Метод Firestore getDocument:
func fsGetDocument() {
let start = UInt64(floor(Date().timeIntervalSince1970 * 1000))
print("Started reading from FS at: \(start)")
for i in 1...100 {
Firestore.firestore().collection("TestCol").document(String(i)).getDocument() { document, error in
let time = UInt64(floor(Date().timeIntervalSince1970 * 1000))
guard let document = document, document.exists && error == nil else {
print("Error: \(error?.localizedDescription ?? "nil"). Returned at: \(time)")
return
}
let data = document.data() as? [String: String] ?? [:]
print("Data: \(data). Returned at: \(time)")
}
}
}
Метод Firestore addSnapshotListener:
func fsAddSnapshotListener() {
let start = UInt64(floor(Date().timeIntervalSince1970 * 1000))
print("Started reading from FS at: \(start)")
for i in 1...100 {
Firestore.firestore().collection("TestCol").document(String(i)).addSnapshotListener() { document, error in
let time = UInt64(floor(Date().timeIntervalSince1970 * 1000))
guard let document = document, document.exists && error == nil else {
print("Error: \(error?.localizedDescription ?? "nil"). Returned at: \(time)")
return
}
let data = document.data() as? [String: String] ?? [:]
print("Data: \(data). Returned at: \(time)")
}
}
}
Каждый метод по существу печатает временную метку unix в миллисекундах, когда метод начинает выполнение, а затем печатает еще одну временную метку unix, когда возвращается каждая операция чтения. Я получил разницу между начальной меткой времени и последней меткой времени, чтобы вернуться.
РЕЗУЛЬТАТЫ - Непрерывность диска отключена:
РЕЗУЛЬТАТЫ - Устойчивость диска:
Структура данных:
Когда методы Firestore getDocument/addSnapshotListener застревают, кажется, что они застряли на длительности, которые примерно кратные 30 секундам. Возможно, это может помочь команде Firebase изолировать, где в SDK он застревает?