iPhone большой NSArray of Strings производительность
-
18-09-2019 - |
Вопрос
У меня есть приложение для iPhone с большим вложенным NSArray of Strings. NSArray проходит 3 уровня глубиной, и на самых глубоких уровнях насчитывается около 15 000 струн. Подавляющее большинство струн содержит менее 20 символов. Время от времени мое приложение висит некоторое время, а затем возобновляется, работая через 5-25 секунд или около того. Это явно неприемлемо. Если я запускаю приложение только с 2000 из струн, висячие становятся намного реже. Так что я почти уверен, что большой NSArray вызывает проблему.
Какая альтернативная структура данных может работать лучше? Все, что мне нужно, это быстро прочитать массив из файла, когда начинается приложение, а затем иметь возможность получать доступ к строкам в случайном случае из массива. [Это на самом деле немного сложнее, чем это; Мне нужно иметь возможность взять случайные строки из заранее определенных подмножества массива.] Программа может захватывать случайную строку так часто, как раз в секунду.
Кстати, NSArray в настоящее время хранится в классе Синглтона.
Решение
В то время как другие структуры данных (Trie) приходят на ум, реальные вопросы:
(1) Есть ли у вас или вы можете профилировать с помощью инструментов во время этих висящих
и с некоммерческим корректным предположением, что массивы являются вашей проблемой
(2) Какие операции вы выполняете на массивах?
Вы не хотите догадываться о том, что вызывает проблемы с производительностью, если у вас нет выбора, вы хотите измерить. Но если вы заставите меня угадать ... я бы задался вопросом, если вы крепко работаете по памяти, и если висятся система, выпускающая низкие предупреждения памяти и все уборки.
Другие советы
С таким большим количеством струн, у вас нет, у вас нет сразу их в столе (верно ???).
Вам действительно нужно поместить их в базу данных и получить доступ к ним по требованию. Основные данные созданы для того, чтобы сохранить большие объектные графики и позволяя вам вытащить детали, которые вам небезразличны, быстро, в то время как они кэшируют вещи за кулисами для вас.
Что касается инструментов, вы действительно хотите использовать Time Profiler, чтобы увидеть, где система тратит все свое время - предпочтительно на самом устройстве. Вы можете обнаружить, что очень много времени тратится на объекты авторерации, например, (которая, как представляется, длинная случайная пауза, казалось бы,) - что будет соответствовать постоянному избавлению от больших частей массивов.