Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка "operator new" и "malloc()" 
:(
    Опции темы
andrew_121
Дата 8.6.2008, 17:52 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



И снова Здравствуйте.
Продолжаю тему по ускорению работы программы.
И так... Со строковыми функциями вопрос решен.(http://forum.vingrad.ru/forum/topic-215618.html)
Но актуален вопрос о выделении памяти.
Есть мнение что, если перегрузить "new" и "malloc()", которые будут выделять память из предварительно выделеного массива, то затраты ресурсов существенно сократятся.

Часть кода я вижу такой:
Код

/* Память под основной массив. */
char* buffer = (char*)malloc( N );
...
...
/* strdup() использует malloc() */
char* str = strdup( "abcdef" );
...
...
free( str );


Вопросы:
1. Как в этой строке "char* buffer = (char*)malloc( N );" использовать стандартный malloc() ?
2. А в этой "char* str = strdup( "abcdef" );" перегруженый ?
3. Как реализовать учет памяти ?
4. Каким образом "free()" должен освобождать память.
5. Как бороться с фрагментацией памяти ?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
jonie
Дата 8.6.2008, 18:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



http://www.rsdn.ru/article/cpp/QuickHeap.xml

вот это почитайте.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Mayk
Дата 8.6.2008, 18:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Этот вопрос рассмотрен в книге Элджера по с++, "C++ for real proreammers" или что-то типа этого. Он там рассматривал эти вопросы выделения на нескольких десятков страниц. Так что rtfm.

А вообще есть такая штука - профайлер. Лучше его пользовать вместо такого гадания на гуще
Цитата(andrew_121 @  8.6.2008,  21:52 Найти цитируемый пост)

Есть мнение что, если перегрузить "new" и "malloc()", которые будут выделять память из предварительно выделеного массива, то затраты ресурсов существенно сократятся.



Это сообщение отредактировал(а) Mayk - 8.6.2008, 18:45


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Lazin
Дата 8.6.2008, 20:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(andrew_121 @  8.6.2008,  17:52 Найти цитируемый пост)
Продолжаю тему по ускорению работы программы.
И так... Со строковыми функциями вопрос решен.(http://forum.vingrad.ru/forum/topic-215618.html)
Но актуален вопрос о выделении памяти.

я так понимаю, что программа уже написана, и ее нужно ускорить?
если да, то нужно смотреть не на реализацию malloc и strcmp, а на используемые алгоритмы.. можно-ли изменить самые тяжелые алгоритмы так, что-бы сложность уменьшилась(вместо O(N*N)->O(log N) и тд), а то что делаешь ты, это тупиковый путь.

Добавлено через 33 секунды
Цитата(Mayk @  8.6.2008,  18:44 Найти цитируемый пост)
профайлер

попробуй, сэкономит кучу времени =)
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 8.6.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Lazin Спасибо...думаю...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 9.6.2008, 16:09 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



andrew_121, к вопросу о профайлерах...
Был у нас программист. И сделал он классную вещь - идентификацию объектов по строковому ключу. Программа жутко тормозила... После прогона через профайлер выяснилось, что больше всего времени кушает алгоритм сравнения строк в std::map.
Как ты думаешь, что я сделал? Ускорил операцию сравнения строк? Ничего подобного. Я посмотрел и выяснил, почему это происходит. А происходит это потому, что 60 раз в секунду обрабатывается порядка десятка супер объектов, каждый из которых обрабатывает порядка десятка объектов, определяя их в каждый конкретный момент путем поиска в 2-х вложеных картах (имя - <серия объектов>, имя - объект). Сделав так, что поиск происходил только на этапе создания супер объекта, я победил проблему.
Заниматься operator new() нужно тогда и только тогда, когда профайлер показал, что они узкое место, а оптимизация очень нужна. Кстати, malloc() ты не перегрузишь. И вообще, зачем мешать в одной программе и malloc() и new?
PM   Вверх
MAKCim
Дата 9.6.2008, 17:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  9.6.2008,  16:09 Найти цитируемый пост)
Кстати, malloc() ты не перегрузишь.

glibc позволяет  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
andrew_121
Дата 9.6.2008, 17:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



bsa:  Спасибо.
Да, я понял что, исправлять последствия кривого ума, не лучший выход.
Вот, размышляю, над тем как правильней побороть сию проблему...
Профайлер говорит что, бОльшая часть времени уходит на, соответственно:
Код

strcpy()
strcmp()
strdup()
strcat()

Но я уже и так, заменил стандартные на макросы. Помогло, на 14%.

Есть еще один, абсолютно правильный выход...но работы ооооо как много.

Продолжаю размышлять....


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
d06osipov
Дата 9.6.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



У Александреску это описано подробно. И неплохую реализацию (с перегрузкой new и delete) содержит библиотека loki. 
PM MAIL   Вверх
bsa
Дата 9.6.2008, 21:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



andrew_121, думаю, стоит подумать о сокращении количества вызовов этих функций путем изменения алгоритма. Если невозможно изменить алгоритм, то стоит максимально ускорить эти функции (например, считывая за единицу времени не символ, а четыре (восемь, шестнадцать...) символа).
Если не поможет, то только смена железа.
PM   Вверх
baldina
Дата 10.6.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(andrew_121 @ 9.6.2008,  17:26)
Профайлер говорит что, бОльшая часть времени уходит на, соответственно:
Код

strcpy()
strcmp()
strdup()
strcat()

не глянуть ли в сторону std::string? там хотя бы бесполезных поисков конца строки нет...
Но это так, слезы: действительно на алгоритм посмотреть надо, может и не нужны там все эти strcpy и strdup ;)
 smile был у нас в одном проекте страшный тормоз. профайлер показал, что миллион раз вызывается некая функция. Это для данных порядка 100 элементов. после переделки способа обработки функция та стала вызываться ... в 1000 раз реже.
PM MAIL   Вверх
andrew_121
Дата 10.6.2008, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



baldina: Прога писана не мной. А предидущим прогером. Прога жутко большая.
Я заменил вызовы стандартных функций, макросами, помогло.
Но радикально перепахивать код не охота...

Это сообщение отредактировал(а) andrew_121 - 10.6.2008, 01:39


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 10.6.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



andrew_121, профайлер должен показать полный стек вызовов этих процедур. Найди наиболее часто встречающуюся ветку и ее переделай.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1017 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.