Какой тип массива использовать для большого количества чисел? - PullRequest
1 голос
/ 16 февраля 2012

Мне нужно хранить большое количество unsigned char с и / или int с (потенциально 100 000 000 и более) в массиве. Математические операции будут часто выполняться над числами в этом массиве, поэтому массив будет часто изменяться, и длина массива также может часто меняться.

Я могу использовать C или Objective-C (или оба). С точки зрения производительности, было бы лучше использовать простой массив C и realloc при необходимости или просто перейти на NSMutableArray? Или у кого-нибудь есть идеи получше?

Пожалуйста, обратите внимание , что производительность - моя главная проблема, я готов написать обширный код перераспределения, если необходимо.

Также: Использование памяти - это вопрос, но не вопрос (если он не заканчивается использованием нескольких гигабайт).

Ответы [ 3 ]

2 голосов
/ 16 февраля 2012

Использование NSMutableArray означает, что у вас есть издержки двух сообщений Objective C, отправляемых каждый раз, когда вы хотите получить или установить значение элемента массива.(Одно сообщение, чтобы получить элемент как объект, и второе, чтобы получить его значение как примитив int.) Отправка сообщения намного медленнее, чем прямой доступ к массиву.

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

Если вам нужна максимальная производительность, просто используйте простой массив C или std::vector, если вы хотите использовать Objective-C ++.

0 голосов
/ 16 февраля 2012

Контейнер : Как насчет C ++? Objective-C ++ и STL могут быть точкой, STL был создан умными людьми, и на самом деле он достаточно эффективен в умелых руках. Хотя наличие потенциально до 100 000 000 записей в любом случае требует некоторых приемов оптимизации.

Рамка : Вы не определили саму задачу, может быть целесообразно использовать что-то вроде CoreData или, может быть, SQLite? Математика может быть выполнена с помощью процедуры SQL.

Первый вариант хорош, если у вас есть, ммм, образцы данных - пиксели, аудиоблоки или что-то в этом роде. Второй способ определенно предпочтителен в большинстве других случаев.

0 голосов
/ 16 февраля 2012

Нужно ли будет расти и расти ваш массив? Использование realloc не очень эффективно.

Поэтому я бы порекомендовал связанный список, поскольку вы можете найти GSList в glib .

...