Мониторинг NS-уведомлений

Я заметил в комментарии к этому сообщению накладные расходы на NSNotifications, пользователь JustSid говорит

накладные расходы не будут заметны, если приложение не отправляет 30+ за цикл цикла выполнения

Я хотел бы написать небольшой вспомогательный класс, который отслеживает, сколько NSNotifications было отправлено в текущем цикле выполнения, и предупреждает меня, если оно превышает определенное предварительно настроенное число. Я знаю, что могу зарегистрироваться для всех уведомлений (передавать nil имени и объекту), но как мне отследить, из какого цикла выполнения они были отправлены?


person Cody C    schedule 04.03.2013    source источник
comment
ИМХО такой подход кажется подозрительным. Я не видел доказательств того, что использование NSNotificationCenter требует больших затрат, чем отправка сообщений напрямую между объектами. Любые проблемы с производительностью будут связаны с обработкой уведомлений (по сравнению с отправкой). Если у вас есть большое количество объектов, наблюдающих за уведомлением и/или выполняющих задачи блокировки потока, это, очевидно, повлияет на производительность приложения. Вот где я бы сосредоточил время и энергию. Комментарий @JustSid является произвольным и спекулятивным.   -  person XJones    schedule 05.03.2013


Ответы (1)


Было бы достаточно легко иметь категорию в NSNotificationCenter, которая увеличивает некоторое внутреннее целое число при добавлении наблюдателя уведомлений (и, следовательно, уменьшает его при удалении), но вы должны спросить себя: насколько это слишком много?

Если вы считаете, что это какое-то произвольное целое число (например, 30), то что произойдет, если вы протестируете его на устройстве, которое имеет больше ограничений по памяти и процессору, чем то, которое у вас есть сейчас? Что произойдет, если вы протестируете его на устройстве, которое может легко обрабатывать 30 наблюдателей и уведомления, плавающие вокруг (это было бы полной тратой времени)? Хотя можно было бы закодировать общие правила, было бы невозможно оценить влияние уведомлений на время отклика приложения в каждом случае.

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

TL;DR Существует так много других шаблонов и структур, которые вы могли бы использовать вместо уведомлений, так почему же именно вы удовлетворяете потребности NSNotification?

person CodaFi    schedule 04.03.2013
comment
Это то, что я планирую запускать только во время отладки, и меня больше беспокоит количество отправляемых уведомлений, а не количество наблюдателей в моем случае. У меня всего несколько наблюдателей. У меня есть класс, который наблюдает за основным потоком, и если он не отвечает в течение настраиваемого периода времени, основной поток NSLogs не отвечает. Я думал о подобном инструменте. Количество уведомлений довольно произвольное, но было бы неплохо знать, отправляю ли я 20 уведомлений за цикл выполнения, делаю ли я изменение и вдруг отправляю 500 уведомлений за цикл выполнения. - person Cody C; 05.03.2013
comment
Тогда просто используйте этот класс. Это кажется достаточно общим, чтобы иметь дело с блокировкой уведомлений. Или, если вы готовы, перепишите NSNotificationCenter. Это действительно не должно быть так сложно. - person CodaFi; 05.03.2013
comment
И мой ответ таков: а) вы сказали мне, что у вас есть инструмент, который может отслеживать блокировку потоков, и б) что такой инструмент будет слишком громоздким, чтобы быть полезным. Вам нужно будет не только отслеживать основной поток, но и фильтровать только методы NSNotification, блокирующие цикл. По крайней мере, это слишком громоздко, как вы его изложили (инструменты отладки обычно отделены от самого приложения, поэтому они не мешают выполнению приложения и не сообщают ложные данные). Перефразируйте или повторно задайте вопрос об этом, чтобы получить лучший ответ. - person CodaFi; 05.03.2013
comment
// Отслеживание количества отправленных за цикл выполнения цикла // ТОЧНО! Вам потребуется отследить цикл выполнения и фильтровать количество отправленных уведомлений! Без открытого интерфейса или объекта RunLoop (NSRunLoop только для OS X), как вы ожидаете это сделать? Именно поэтому я говорил вам, что это слишком много работы. Поверьте мне, если бы получить вызовы цикла выполнения было легко, то был бы миллион ответов о том, как это сделать. - person CodaFi; 05.03.2013
comment
И вы ожидаете, что цикл выполнения просто передаст это вам? Цикл выполнения не заботится о том, что выполняется, цикл выполнения заботится только о своевременном запуске кода. Мало того, на iOS нет открытого API для доступа к циклу выполнения! Опять же, поверьте мне, если бы это было легко, было бы гораздо больше ответов об этом. - person CodaFi; 05.03.2013
comment
Что ж, это гораздо более полезный ответ. Я обновил свой вопрос, чтобы попытаться сделать его немного яснее. Спасибо за помощь. - person Cody C; 05.03.2013