SlideShare uma empresa Scribd logo
1 de 57
Spark: практика
разработки
высоконагруженных iOS-
приложений
Андриан Буданцов
.
• PDF Expert, Scanner Pro,
Documents, Calendars, Spark,
Printer Pro, Fluix
• 6 больших iOS/macOS
кодовых баз; большей частью
ObjC, в новых проектах Swift
• Почтовый клиент
• Кодовое название SmartMail
• Начата разработка в феврале 2014 года
• Первый релиз 29 мая 2015
Достаточно быстрая почта
Методология тестирования
• Субъективная оценка
• Xcode
• Тесты
Субъективная оценка: Dog Fooding
Субъективная оценка: β
Xcode
Performance Tests
- [XCTest measureBlock:]
• установить baseline!
- [RDTestCase measureBlock: limit:]
• Проверка прямо в коде
• Защита от разницы на порядок
• Тесты UI
• Общее время выполнения
Производительность ≈ Энергоэффективность
Критические места
1. Получение
2. Обработка
3. Просмотр
кадр, 16 мс
Первый запуск,
использование,
батарейка
Сеть, холодный старт
3. Просмотр почты
Просмотр: интерфейс Thread Viewer
Видели?
Задержка > 1 кадр
UICollectionView + UILabel + Autolayout
Считает ширину/высоту
Собирает элементы в письмоСобирает список писем, нужна
высота UICollectionViewCell
Все работает на Main Thread
0
0.5
1
1.5
2
2.5
3
100 200 300 400
Время, сек.
Количество View
Производительность Autolayout
Источник: Флориан Куглер, http://bit.ly/2fhJbwB
Ручной layout
• Считаем frame всех view
• Оценка размера текста с помощью UILabel
• Меньше связей, чем с Auto-Layout => быстрее
• Много кода layout
• Простор для улучшения
ASDisplayNode
ASDisplayNode UIView CALayer
содержит
ИЛИ
• NSObject
• Thread Safe
• -[ASDisplayNode view] содержит view
Background поток
• ASTextNode
• Измерение ширины текста (TextKit)
• Рендер текста
• ASImageNode
• Загрузка/декодирование изображения
• Layout
• Похож на FlexBox
Саб-класс ASRangeController… +
Саб-класс ASTextNode…
Саб-класс ASTextNode: выделение текста
«Листание почты»
«Листание почты»
следующие и
предыдущие письма
(UI загружается
асинхронно)
Текущее письмо (тред)
Просмотр: интерфейс Message List
UITableView + UITableViewCell
• Оптимизация для GPU медленных устройств
• От множества UIView к -[UIView drawRect:]
• Влияет на скорость создания таблицы
• Большой метод -drawRect
2. Обработка почты
Mailcore + XML + RegEx + … + SQLite
Оптимизация регулярных выражений
(альтернативные группы)
(?>to|кому|a[n]?|à|til[l]?|para|À|destinataire|Pour)[^Sn]*+:
(?=[tкaàtpÀdP])(?>to|кому|a[n]?|à|til[l]?|para|À|destinataire|Pour)[^Sn]*+:
На 30% быстрее!
Было
Стало c выносом первой буквы из альт. групп
Кэширование NSRegularExpression
[NSRegularExpression regularExpressionWithPattern:options:error:]
static NSRegularExpression *cachedRegularExpression;
На 44% быстрее, тест: 1000 раз подряд,
1280 байт
Было
Стало после кэширования
Оптимизация регулярных выражений
(Remove case-insensitive)
(?i)(?=[tкaàtpÀd])(?>to|кому|a[n]?|à|til[l]?|para|À|destinataire|Pour)[^Sn]*+:(?-i)
(?=[tкaàtpÀd])(?>to|кому|a[n]?|à|til[l]?|para|À|destinataire|Pour)[^Sn]*+:
На 60% быстрее, тест: 1000 раз подряд, 1280 байт текст
Было
Стало без (?i)
Индексы
•Не забыть
•EXPLAIN
•Составные индексы
•DESC индексы
SQLite: Full Text Search
Проблемы с FTS4
• Язык запросов
• Не полная поддержка AND, OR, NOT в MATCH
• Долгое «прогревание» при первом запросе
• Задержки до 10+ секунд при индексировании
• Нагрузка на IO / CPU
• Релевантность (?)
SQLite FTS5
CREATE VIRTUAL TABLE IF NOT EXISTS messagesfts USING fts4(messagePk,
messageFrom, messageTo, subject, searchBody, tokenize=unicode61)
CREATE VIRTUAL TABLE IF NOT EXISTS messagesfts USING fts5 (messagePk,
messageFrom, messageTo, subject, searchBody)
SQLite FTS5
• SQLite 3.9 + SQLITE_ENABLE_FTS5
• Нет задержек при индексировании (быстро!)
• Улучшенный язык запросов
~ 17%
• Скорость поиска:
FTS4
FTS5
Трюки SQLite
• Несколько баз
• Задержка при индексировании/поиска не влияет на основную базу
• Миграции
• ADD COLUMN — бесплатен
• Пересоздание таблицы для других изменений
• Несколько баз
• C-функции в SQLite
• atomic_write: +10% к записи на iOS
1. Получение почты
IMAP & EWS
HTTP vs IMAP
• TCP / TLS — так же
• Больше времени на авторизацию, выбор папки
• XOAuth
• Не поддерживается NSURLSession
• Постоянный обмен короткими пакетами
• Polling / long-polling: NOOP/ IDLE
Push-сообщения
• UIBackgroundModeFetch — не достаточно надежен
• Посылаем push-сообщения с сервере
Минутка бэкенда: SmartMail Cloud
…
APP
APNS
HTTP запрос
DB & Manager
Worker Worker
Filter & Pusher
IMAP IMAP
HTTP-Запрос в SmartMailCloud
• Авторизация к IMAP серверу (Oauth, пароль)
• Публичный ключ девайса
• Правила для отправки push-сообщений на JSON “LISP”
["or",
["has", "from", "mother@home.io"],
["has", "from", "boss@work.com"]
]
Узкое место: время от пуша до письма
Загрузка писем по HTTP
• Тело письма (<2Мб) скачивается нашей инфраструктурой и
шифруется публичным ключом девайса
• Пуш-сообщение содержит ссылку на зашифрованное письмо
• Тело письма скачивается Push Service Extension
• …
• PROFIT!
Минутка бэкенда: SmartMail Cloud
…
APP
APNS
HTTP запрос
DB & Manager
Worker Worker
Filter & Pusher
IMAP IMAPMail
Storage
HTTP/2
• HTTP/2 быстрее HTTP/1.1
• Поддерживается, начиная с iOS 9
• Более эффективен в мелочах
• Мультиплексирование
LZFSE
• Алгоритм от Apple
• Open Source (github)
• ~ 40% быстрее ZLIB
• Spark: экономия ~ 1 секунды CPU времени
• Альтернативы: bzip2, brotli
• Время сжатия на сервере?
0. Запуск
Скорость запуска
• application: willFinishLaunchingWithOptions:
• Менеджер загрузки приложения
• Параллельные операции инициализации
Спасибо!
@andrianbdn
andrian@readdle.com
Отдельная благодарность команде Spark и
лично Виктору, Александру, Дмитрию и Владимиру
NSXMLParser vs libxml (SAX)
NSXMLParser
libxml 40% быстрее
LZFSE, zlib, Brotli, bzip2
0
0.5
1
1.5
2
2.5
0 50 100 150 200 250
Соотношение
Скорость распаковки, МиБ/сек
BZIP2 L5
Brotli L11
ZLIB L5 LZFSE
Источник, Squash Benchmark Unstable, http://bit.ly/2fgstiv
LZFSE, zlib, Brotli, bzip2
0
0.5
1
1.5
2
2.5
0 5 10 15 20 25 30 35 40 45
Соотношение
Скорость упаковки, МиБ/сек
BZIP2 L5
Brotli L11
ZLIB L5 LZFSE
Источник, Squash Benchmark Unstable, http://bit.ly/2fgstiv

Mais conteúdo relacionado

Mais de Ontico

Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Ontico
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Ontico
 
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...Ontico
 
Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...
Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...
Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...Ontico
 
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)Ontico
 
Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)
Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)
Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)Ontico
 
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)Ontico
 

Mais de Ontico (20)

Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
 
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
 
Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...
Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...
Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...
 
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
 
Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)
Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)
Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)
 
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)
 

Spark: практика разработки высоконагруженных iOS-приложений / Андриан Буданцов (Readdle Inc.)

Notas do Editor

  1. Всем привет, спасибо что пришли. Я тех-директор Readdle, мы делаем приложения для iOS чуть больше времени чем существует iOS.
  2. Возможно вы слышали про некоторые из наших популярных приложений. У нас в компании 6 больших iOS кодовых баз, исторически мы используем Objective-C и с прошлого года начинаем новые проекты на Swift.
  3. В этом докладе я буду рассказывать про наш почтовый клиент Spark. Заранее прошу прощения у тех, кто пришел послушать про Open Source проект обработки данных Apache Spark с которым мы только делим общее название. Мы решили делать наш Спарк в 14 году для проверки наших идей по улучшению UX, автоматизации работы с почтой и, потенциально — машинного обучения. В течении первого года разработки, мы называли приложениие СмартМэил — мы строим почту более «умную» чем стандартную.
  4. Поскольку на iOS уже есть стандартный почтовый клиент; то единственный способ выпустить успешное новое почтовое приложение — это «убить» для конкретного пользователя стандартный Mail.app. Заставить пользователя переключится — сложно.
  5. Мы не делаем самое быстрое в мире приложение — основной наш фокус для другой функциональности которая приносит людям пользу — умные оповещения, управления письмами и организация работы с почтой. Но если приложение будет не достаточно быстрым — на него не перейдут.
  6. Как мы определяем «достаточно быстро»? Субъективно, с помощью Xcode и запуская тесты.
  7. Для хранения писем с самого начала работы мы выбрали стандартный SQLite и решили отказаться от каких-либо ORM, которые создают дополнительные непрозрачные слои при работе с данными. Для удобства интеграции с Obj-C, мы так же используем FBDB — библиотеку которая позволяет использовать Foundation типы данных (NSString) при работе с SQLite.