Почему многопоточность Swift намного менее эффективна при использовании функций в импортируемых модулях? - PullRequest
0 голосов
/ 06 февраля 2019

Я собираюсь опустить здесь много «не относящихся к делу» деталей, чтобы помочь людям сконцентрироваться на актуальном вопросе.

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

Используя классы XCTest, я обнаружил, что с моим замыканием, вызывающим функцию, определенную в моем модуле, если я использую DispatchQueue.concurrentPerform с одной итерацией, требуетсявремя т.Когда повторяется с 5 итерациями, он работает примерно на 5% медленнее (я доволен этим).

Примечание: функция является статической функцией для структуры (моя коллекция процедур исчисления).

Однако, если я помещу функцию в отдельный модуль и импортирую ее, повторение теста с 1 итерацией займет аналогичное время t.Но теперь, когда я пытаюсь сделать это с 5 итерациями, вызов занимает в два раза больше времени (на 105% медленнее).

Swift версия: 4.2.1 ОС: macOS 10.14.3 Xcode 10.1 Процессор: 6-ядерный Core i7(Mac mini 2018)

Все «объекты» - это структуры и типы значений, используемые повсеместно, кроме ссылки на функцию.

Еще раз краткая сводка: с использованием DispatchQueue.concurrentPerform () , по сравнению с базовым временем для 1 итерации определенной функции тот же модуль , 5 итераций на 5% медленнее .Однако при выполнении того же процесса с использованием функции, которая была определена в импортированном модуле , базовое время остается неизменным в течение 1 итерации, но 5 итераций на 105% медленнее .

Кто-нибудь может объяснить, почему это происходит, и, надеюсь, предложить способ избежать этого замедления, сохраняя мою коллекцию в импортируемом модуле?

Не стесняйтесь задавать вопросы, если вам нужна дополнительная информация.

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема была решена.Понятия не имею, в чем причина.

Удалил мой проект, создал новый, импортировал в него файлы, включил его в рабочую область.

Теперь 5 параллельных потоков обрабатывают только 10% длиннее, чем один поток (выполнение 5-кратного объема работы)Все равно хотел бы знать, что вызвало проблему, и было бы хорошо, если бы падение эффективности составило всего 5%, как это было в ранее упомянутом случае.

Но для этого улучшения только с начала нового проекта, я 'Я не собираюсь ссориться!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...