Часто приложение iOS запускает несколько потоков в процессе. Иногда эти потоки используются для выполнения некоторых локальных вычислений или загрузки контента из Интернета. Мы часто создаем фоновый поток всякий раз, когда выполняем какое-либо вычисление или задачу загрузки, которая может выполняться в фоновом режиме. Но мы часто игнорируем стоимость создания потоков.
В настоящее время все устройства имеют как минимум от 3 до 4 ядер, что позволяет нашему процессору выполнять более одной задачи одновременно. Но использование этих ядер сопряжено с затратами на их создание и обслуживание. Это также влияет на производительность приложения!
Каждый поток не только занимает некоторое время при создании, но также использует память в ядре, а также пространство памяти приложения.
Структуры данных ядра
Каждый поток потребляет почти 1 КБ памяти в пространстве ядра. Эта память используется для хранения структур данных и атрибутов, относящихся к потоку. Это проводная память, и ее нельзя листать.
Размер стека
Размер стека основного потока составляет 1 МБ и не может быть изменен. Любому другому потоку по умолчанию выделяется 512 КБ пространства стека. Обратите внимание, что полный стек не создается сразу. Фактический размер стека растет по мере использования. Таким образом, даже если основной поток имеет размер стека 1 МБ, в какой-то момент времени фактический размер стека может быть намного меньше.
Перед запуском потока размер стека может быть изменен. Минимально допустимый размер стека составляет 16 КБ, а размер должен быть кратен 4 КБ. Пример кода ниже показывает, как можно настроить размер стека перед запуском потока.
+(NSThread
*)createThreadWithTarget:(id)target
selector:(SEL)selector
object:(id)argument
stackSize:(NSUInteger)size
{
if(
(size
%
4096)
!=
0)
{
return
nil;
}
NSThread
*t
=
[[NSThread
alloc]
initWithTarget:target
selector:selector
object:argument];
t.stackSize
=
size;
return
t;
}
Время создания темы
Время, необходимое для фактического запуска потока после создания, варьировалось от 5 мс до более 100 мс, в среднем около 29 мс. Это может занять много времени, особенно если вы запускаете несколько потоков во время запуска приложения.
Увеличенное время запуска потока может быть связано с несколькими переключениями контекста, которые имеют накладные расходы!!!
Спасибо!!! 😊 😊 😊
Подписывайтесь на меня в Linkedin-
Профиль Linkedin: https://www.linkedin.com/in/ankur-jain-11548782/