2012-02-16 5 views
1

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

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

Обратите внимание:, что исполнение является моей главной заботой, я готов написать обширный код перераспределения, если это необходимо.

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

+1

Код перераспределения не обязательно должен быть обширным: 'int * data = 0; size_t size = 0, capacity = 0; 'устанавливает пустой массив (или использует структуру, конечно). Затем для обеспечения определенной емкости: 'if (capacity

ответ

2

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

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

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

+0

Если я использую простой массив C, то каков наилучший способ «realloc'ing? Насколько дорогой звонок?Лучше ли выделять больше, чем нужно, чтобы сэкономить время? – Greg

+2

Вам нужно увеличить массив на коэффициент (умножение), а не фиксированную сумму (добавление) при каждом перераспределении. Например. 'newSize = oldSize * 2', ** not **' newSize = oldSize + 100'. –

+1

ваш массив крошечный. 10000 ints ничего. Выделите больше, чем вам нужно, и будьте любезны, если вам нужно. –

0

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

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

+0

Связанные списки не звучат здесь. Нет случайного доступа. Плюс доступ медленный со всеми дополнительными трещинами. В 64-битной системе накладные расходы списка больше, чем сам список. –

+0

@DavidHeffernan Использование 'realloc' в порядке, если вы не делаете это часто. Если вы удвоите его, когда вам нужно увеличить, и просто не уменьшайте его, это будет очень быстро (и может потерять память). – ugoren

+0

@ugoren действительно так, это точно мое мнение –

0

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

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

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

+0

Нет базы данных SQL или что-то в этом роде. Данные могут потенциально прибывать откуда угодно - их можно загрузить из текстового файла или самопроизвольно производить во время выполнения. В принципе, он обычно начинается с короткого замыкания, а затем становится все больше и больше по мере добавления большего числа чисел и выполнения математических операций. – Greg

+0

Чем я выбрал STL. std :: vector достаточно умен, чтобы избежать перераспределения при каждом нажатии, STL позволяет использовать функторы для обработки данных, вставляя результаты быстрого кода. В целом, стоит попробовать и (ИМХО) предпочтительнее, чем Objective-C и простые C-массивы. – Gobra

+0

Еще одно преимущество использования стандартных контейнеров на C++ состоит в том, что если фрагментация памяти вызывает проблемы (как отметил Дэвид Хеффернан в комментарии к ответу rob mayoff), тогда «оптимизационный трюк» для его исправления обычно тривиален - просто переключитесь с 'std :: vector' to 'std :: deque'. –

Смежные вопросы