Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Fireman Гость
|
Добавлено: Чт Ноя 28 2002 14:40 Заголовок сообщения: операторы new & delete |
|
|
Решил проверить свои алгоритмы на скорость работы - задал около миллиарда циклов и вот что обнаружил
операторы new & delete работают раз в 50 медленнее, чем извлечение значений из памяти
нельзя ли как нибудь убыстрить механизмы выделения памяти? ибо алгоритмы требуют частого выделения и освобождения памяти |
|
Вернуться к началу |
|
|
Олигарх
Зарегистрирован: 28.09.2002 Сообщения: 102
|
Добавлено: Чт Ноя 28 2002 16:03 Заголовок сообщения: Re: |
|
|
Что за язык программирования-то? |
|
Вернуться к началу |
|
|
Fireman Гость
|
Добавлено: Чт Ноя 28 2002 16:07 Заголовок сообщения: Re: |
|
|
Язык C++ |
|
Вернуться к началу |
|
|
Chea Гость
|
Добавлено: Чт Ноя 28 2002 18:20 Заголовок сообщения: Re: операторы new & delete |
|
|
Возможно я ошибаюсь - давно это было но.. 1. В каком-то *.h файле имеется описание new и delete через malloc и подобные функции. Следовательно использование этих функций должно ускорить работу т.к. исключит лишний вызов и ряд условий из работы. 2. Опишу как выделяется память (во всяком случае когда я занимался кодированием в плотную). Память выделяется блоками по 16 байт (параграф). причем если просим 2 байта нам всеравно дадут 16. Если просим больше 13 то дадут 2 параграфа по 16 байт построенных в список. Первые 4 байта это указатель на следующий блок и только 12 байт даны для работы. Следовательно для чтения из памяти данных больше 12 байт (как и для записи) необходимо пройтись по списку, собрать из частей данные (строку например) и подать для использования. Такой же геморой и при записи. Так что я думаю можно несколько ускорить работу если стараться выделять память блоками требующими меньше обработки (например не более 12 байт) по возможности конечно. Тем более если выделение и работа с памятью используется в цикле с большим количеством итераций.
Еще раз напомню что могу ошибаться т.к. за последнее время могли и механизмы работы измениться. |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Чт Ноя 28 2002 20:02 Заголовок сообщения: Re: операторы new & delete |
|
|
Считаю, что ускорить возможно только изменением алгоритма таким образом, чтобы свести операции new/delete к минимуму. Возможные варианты: 1. если создаваемый/уничтожаемый объект имеет один и тот же размер, то реализация очевидна, то есть один раз выделить память, а потом повторно использовать ее; 2. если создаваемый/уничтожаемый объект имеет переменный размер, то просто выделять максимальный размер (рискну утверждать, что максимально возможный размер известен всегда), далее как в п. 1; 3. если создаются/уничтожаются объекты разных типов, то опять выделить один раз максимальную память, а обращаться к ней, переопределяя тип указателя (casting). Стоит помнить, что какими бы медленными ни были операции выделения/освобождения памяти, если их количество сравнимо с количеством еще более медленных операций (например, дисковых), ускорять их нет смысла. |
|
Вернуться к началу |
|
|
Alexy
Зарегистрирован: 22.10.2003 Сообщения: 48
|
Добавлено: Вс Дек 01 2002 13:53 Заголовок сообщения: Re: операторы new & delete |
|
|
Для ускорения процедур new delete можно применить а. аллокатор - выделяет память крупными блоками для себя. Юзер же, как правило получает ptr из уже существующего блока. В среднем выигрываем в скорости, проигрываем в размерах используемой памяти. б. идиому виртуального конструктора. В наиболее простом виде это выглядит так: void* ::operator new (unsigned cb, void* ptr) { return ptr; } |
|
Вернуться к началу |
|
|
SAV
Зарегистрирован: 22.10.2002 Сообщения: 46 Откуда: Нижний Новгород
|
Добавлено: Чт Дек 05 2002 10:32 Заголовок сообщения: Я не ослышался??? |
|
|
Виртуальный конструктор???? |
|
Вернуться к началу |
|
|
Alexy
Зарегистрирован: 22.10.2003 Сообщения: 48
|
Добавлено: Пт Дек 06 2002 23:36 Заголовок сообщения: Re: Я не ослышался??? |
|
|
Нет, не ослышался. Насколько мне известно, этот паттерн впервые предложен Джеймсом Копленом (James Coplien). Виртуальным конструктор назван без всякой связи с виртуальными функциями. 'Виртуальность' заключается в возможности изпользования оператора new без реальной аллокации памяти.
void* operator new(unsigned cb, void* ptr) { return ptr; }
// используем обычный operator new Foo* foo1 = new Foo;
Bar* bar = new(foo1) Bar; // operator new возращает адрес из foo1 без // аллокации памяти |
|
Вернуться к началу |
|
|
|