Вопрос

У меня есть приложение для iPhone с большим вложенным NSArray of Strings. NSArray проходит 3 уровня глубиной, и на самых глубоких уровнях насчитывается около 15 000 струн. Подавляющее большинство струн содержит менее 20 символов. Время от времени мое приложение висит некоторое время, а затем возобновляется, работая через 5-25 секунд или около того. Это явно неприемлемо. Если я запускаю приложение только с 2000 из струн, висячие становятся намного реже. Так что я почти уверен, что большой NSArray вызывает проблему.

Какая альтернативная структура данных может работать лучше? Все, что мне нужно, это быстро прочитать массив из файла, когда начинается приложение, а затем иметь возможность получать доступ к строкам в случайном случае из массива. [Это на самом деле немного сложнее, чем это; Мне нужно иметь возможность взять случайные строки из заранее определенных подмножества массива.] Программа может захватывать случайную строку так часто, как раз в секунду.

Кстати, NSArray в настоящее время хранится в классе Синглтона.

Это было полезно?

Решение

В то время как другие структуры данных (Trie) приходят на ум, реальные вопросы:

(1) Есть ли у вас или вы можете профилировать с помощью инструментов во время этих висящих

и с некоммерческим корректным предположением, что массивы являются вашей проблемой

(2) Какие операции вы выполняете на массивах?

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

Другие советы

С таким большим количеством струн, у вас нет, у вас нет сразу их в столе (верно ???).

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top