Главная
АИ #31 (161)
Статьи журнала АИ #31 (161)
Многопоточность и синхронизация в Swift: оптимизация производительности

10.5281/zenodo.10026805

Многопоточность и синхронизация в Swift: оптимизация производительности

Автор(-ы):

Малыгин Антон Игоревич

4 августа 2023

Секция

Информационные технологии

Ключевые слова

многопоточность
синхронизация
Swift
повышение производительности
оптимизация производительности

Аннотация статьи

Swift представляет собой достаточно молодой, но при этом быстро развивающийся язык программирования, представленный компанией Apple в 2014 году. Он служит основой для создания инновационных приложений на платформах iOS и MacOS. Этот язык программирования включил в себя лучшие практики из Objective-C, Python и C#, стремясь обеспечить программистам легкость в чтении и устойчивость к ошибкам.

Многопоточность в данном случае является ключевой характеристикой, позволяющей нескольким программам выполняться параллельно в нескольких потоках. Что в свою очередь открывает возможности для более эффективного использования ресурсов устройства и обеспечивает надежность кода. Разные языки программирования предоставляют различные подходы к обработке параллелизма. Например, в C# используется конструкция async/await, в то время как в Swift изначально предпочиталась работа с замыканиями для выполнения операций в отдельных потоках.

Однако, стоит отметить, что в последующих версиях Swift также была добавлена поддержка конструкции async/await. Исходно в Swift планировалась поддержка этой конструкции, но ее введение было отложено до следующего релиза. Вместо этого, на тот момент, использовался Grand Central Dispatch (GCD) – библиотека, разработанная Apple на основе libdispatch языка C. Ее задача – эффективно управлять потоками задач, распределяя их на доступные ядра процессора и обеспечивая параллельное выполнение [1].

В связи с чем в рамках данной статьи автор выделил целью изучение многопоточности и синхронизации в Swift как факторах оптимизации производительности. Для обеспечения данной цели в качестве методологической базы использовались разные научные журналы, статьи, специальная литература, мнения экспертов и ученых. Что в свою очередь позволило полноценно рассмотреть данную тему.

Текст статьи

Введение

Swift, является передовым языком программирования, которые нашел свое применение в разработке приложений для iOS, macOS, watchOS и tvOS. Его популярность среди разработчиков обусловлена высокой скоростью и интуитивной простотой. Но, несмотря на все его достоинства, производительность приложений на Swift требует особого внимания.

Рис. 1. Возможности использования Swift

Один из ключевых подходов – использование структур вместо классов. Swift предоставляет два основных типа объектов: классы и структуры. Если ваше приложение оперирует большим количеством объектов, рекомендуется предпочесть структуры классам. Структуры, как правило, занимают меньше места в памяти и обладают более высокой производительностью по сравнению с классами.

Еще один эффективный метод – использование «ленивой» инициализации. Этот процесс позволяет создавать объекты только в тот момент, когда они действительно необходимы в приложении. Такой подход помогает сэкономить память и ускорить выполнение приложения.

Для оптимизации процесса выполнения задач пригодится поддержка многопоточности в Swift. Разделение работы на небольшие задачи и их параллельное выполнение способствует увеличению скорости приложения, особенно при обработке больших объемов данных.

Помимо этого, правильный выбор коллекций имеет значение. Swift предоставляет различные типы коллекций, такие как массивы и словари. Однако использование оптимизированных вариантов, например, Set вместо массива для проверки существования элементов в коллекции, может значительно ускорить выполнение приложения.

Наконец, использование функций высшего порядка – еще один способ повысить эффективность приложения. Swift поддерживает функции высшего порядка, позволяя передавать и возвращать функции как аргументы. Этот подход особенно полезен при работе с большими объемами данных, ускоряя процессы обработки.

Используя данные методы оптимизации на практике, можно создать высокопроизводительные приложения на Swift, удовлетворяя потребности пользователей в быстрой и надежной работе [2].

1. Принцип многопоточности

Многопоточность в Swift представляет собой эффективный метод для параллельного выполнения задач. Этот подход использует несколько потоков выполнения, что позволяет задачам выполняться одновременно, не блокируя основной поток. Эта техника особенно важна в приложениях, где требуется синхронное выполнение различных задач.

Кроме того, Swift предоставляет механизм качества обслуживания (QoS), который позволяет разработчикам управлять приоритетами задач. Назначая разные уровни приоритета различным задачам, можно гарантировать, что важные задачи выполняются в первую очередь, обеспечивая эффективное функционирование приложения.

Интегрирование многопоточности и QoS в приложениях с таймерами является ключевым подходом для оптимизации работы. Создание фоновых потоков с использованием DispatchQueue и назначение высокого уровня QoS задачам с высоким приоритетом позволяют функциям выполняться параллельно без привлечения основного потока.

Более того, использование нескольких таймеров в разных потоках обеспечивает согласованное выполнение задач с разными интервалами. Этот метод позволяет разработчикам гарантировать совместное выполнение задач, предотвращая их взаимное влияние.

Таким образом, сочетание многопоточности и QoS в Swift не только обеспечивает эффективное выполнение задач, но и гарантирует оптимальную производительность приложений, особенно в ситуациях, требующих точного согласования временных интервалов и высокой степени параллелизма [3].

Также следует поговорить о возможностях функций многопоточности в Swift.

1 Async функции, в случае необходимости отмечайте функции ключевым словом async, необходимым для обозначения асинхронной работы, что в свою очередь позволит использовать await внутри функции.

Рис. 2. Пример использования функции Async

2 Использование функции await возможно для ожидания завершения и получения результата.

3 Процесс создания и последующего выполнения задач. Для этого следует применять тип task, в целях создания и последующего выполнения параллельных задач, которые могут быть структурированы для одновременного или последовательного выполнения.

Рис. 3. Пример использования функции task

4 Возможно также использование структурированной конструкции параллелизма при помощи функции TaskGroups, для группировки и управления параллельными задачами.

Рис. 4. Пример использования функции TaskGroups

5 Для того, чтобы обработать отмену задачи необходимо использовать функцию Task.cancel() или Task.isCancelled 

6 В целях создания классов и структур можно применять функцию actor 

Рис. 5. Пример использования функции actor

В случае возникновения ошибок и исключений для их устранения можно использовать асинхронные функции, при помощи механизмов обработки ошибок Swift [5].

Рис. 6. Пример использования функций для обработки ошибок и исключений

2. Синхронизация в Swift

Синхронизацию в Swift можно выполнить с использованием блокировки. Блокировки могут быть использованы для предотвращения одновременного доступа к общим данным нескольким потоками выполнения. В Swift блокировка может быть выполнена с использованием конструкции `synchronized` или `NSLock`.

Для использования `synchronized` нужно выполнить следующую конструкцию, которая будет представлена на рисунке 1.

Рис. 7. Конструкция для использования синхронизации в Swift

где `lockObj` – объект блокировки.

Также можно использовать `NSLock`, в данном случае необходимо создать экземпляр объекта `NSLock`, который будет использоваться как блокировка, и затем вызвать `lock()` и `unlock()` перед и после критической секции кода, соответственно [5]:

Рис. 8. Конструкция использования NSLock в Swift

Заключение

Таким образом оптимизация производительности приложений на Swift – это сложный процесс, который требует знаний и опыта в программировании. Однако, используя информацию, представленную в статье возможно существенно ускорить работу приложения. Используя многопоточность и качество обслуживания (QoS), разработчики могут добиться значительного повышения производительности и гарантировать, что задачи выполняются с соответствующим уровнем приоритета.

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

Список литературы

  1. Антонов, В. А. Многопоточность в языке Swift / В. А. Антонов. – Текст : непосредственный // Молодой ученый. 2021. № 12 (354). С. 15-18.
  2. Оптимизация производительности приложений на Swift .[Электронный ресурс] Режим доступа: https://qaa-engineer.ru/optimizacziya-proizvoditelnosti-prilozhenij-na-swift/. – (дата обращения 02.10.2023).
  3. Maximizing Efficiency in Timer Applications with Multithreading and QoS in Swift.[Электронный ресурс] Режим доступа: https://en.anyquestion.info/a/maximizing-efficiency-in-timer-applications-with-multithreading-and-qos-in-swift. – (дата обращения 02.10.2023).
  4. Руководство по Использованию Многопоточности в Swift [Электронный ресурс] Режим доступа: https://habr.com/ru/articles/761980/. – (дата обращения 02.10.2023).
  5. Как работать с синхронизацией в Swift? [Электронный ресурс] Режим доступа: https://qaa-engineer.ru/kak-rabotat-s-sinhronizacziej-v-swift/. – (дата обращения 02.10.2023).

Поделиться

Малыгин А. И. Многопоточность и синхронизация в Swift: оптимизация производительности // Актуальные исследования. 2023. №31 (161). URL: https://apni.ru/article/7233-mnogopotochnost-i-sinkhronizatsiya-v-swift-op

Похожие статьи

Другие статьи из раздела «Информационные технологии»

Все статьи выпуска
Актуальные исследования

#27 (209)

Прием материалов

29 июня - 5 июля

осталось 6 дней

Размещение PDF-версии журнала

10 июля

Размещение электронной версии статьи

сразу после оплаты

Рассылка печатных экземпляров

22 июля