![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
И снова Здравствуйте.
Продолжаю тему по ускорению работы программы. И так... Со строковыми функциями вопрос решен.(http://forum.vingrad.ru/forum/topic-215618.html) Но актуален вопрос о выделении памяти. Есть мнение что, если перегрузить "new" и "malloc()", которые будут выделять память из предварительно выделеного массива, то затраты ресурсов существенно сократятся. Часть кода я вижу такой:
Вопросы: 1. Как в этой строке "char* buffer = (char*)malloc( N );" использовать стандартный malloc() ? 2. А в этой "char* str = strdup( "abcdef" );" перегруженый ? 3. Как реализовать учет памяти ? 4. Каким образом "free()" должен освобождать память. 5. Как бороться с фрагментацией памяти ? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Этот вопрос рассмотрен в книге Элджера по с++, "C++ for real proreammers" или что-то типа этого. Он там рассматривал эти вопросы выделения на нескольких десятков страниц. Так что rtfm.
А вообще есть такая штука - профайлер. Лучше его пользовать вместо такого гадания на гуще Это сообщение отредактировал(а) Mayk - 8.6.2008, 18:45 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
я так понимаю, что программа уже написана, и ее нужно ускорить? если да, то нужно смотреть не на реализацию malloc и strcmp, а на используемые алгоритмы.. можно-ли изменить самые тяжелые алгоритмы так, что-бы сложность уменьшилась(вместо O(N*N)->O(log N) и тд), а то что делаешь ты, это тупиковый путь. Добавлено через 33 секунды попробуй, сэкономит кучу времени =) |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Lazin Спасибо...думаю...
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
andrew_121, к вопросу о профайлерах...
Был у нас программист. И сделал он классную вещь - идентификацию объектов по строковому ключу. Программа жутко тормозила... После прогона через профайлер выяснилось, что больше всего времени кушает алгоритм сравнения строк в std::map. Как ты думаешь, что я сделал? Ускорил операцию сравнения строк? Ничего подобного. Я посмотрел и выяснил, почему это происходит. А происходит это потому, что 60 раз в секунду обрабатывается порядка десятка супер объектов, каждый из которых обрабатывает порядка десятка объектов, определяя их в каждый конкретный момент путем поиска в 2-х вложеных картах (имя - <серия объектов>, имя - объект). Сделав так, что поиск происходил только на этапе создания супер объекта, я победил проблему. Заниматься operator new() нужно тогда и только тогда, когда профайлер показал, что они узкое место, а оптимизация очень нужна. Кстати, malloc() ты не перегрузишь. И вообще, зачем мешать в одной программе и malloc() и new? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
bsa: Спасибо.
Да, я понял что, исправлять последствия кривого ума, не лучший выход. Вот, размышляю, над тем как правильней побороть сию проблему... Профайлер говорит что, бОльшая часть времени уходит на, соответственно:
Но я уже и так, заменил стандартные на макросы. Помогло, на 14%. Есть еще один, абсолютно правильный выход...но работы ооооо как много. Продолжаю размышлять.... -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| d06osipov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
У Александреску это описано подробно. И неплохую реализацию (с перегрузкой new и delete) содержит библиотека loki.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
andrew_121, думаю, стоит подумать о сокращении количества вызовов этих функций путем изменения алгоритма. Если невозможно изменить алгоритм, то стоит максимально ускорить эти функции (например, считывая за единицу времени не символ, а четыре (восемь, шестнадцать...) символа).
Если не поможет, то только смена железа. |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
не глянуть ли в сторону std::string? там хотя бы бесполезных поисков конца строки нет... Но это так, слезы: действительно на алгоритм посмотреть надо, может и не нужны там все эти strcpy и strdup ;) |
||||
|
|||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
baldina: Прога писана не мной. А предидущим прогером. Прога жутко большая.
Я заменил вызовы стандартных функций, макросами, помогло. Но радикально перепахивать код не охота... Это сообщение отредактировал(а) andrew_121 - 10.6.2008, 01:39 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
andrew_121, профайлер должен показать полный стек вызовов этих процедур. Найди наиболее часто встречающуюся ветку и ее переделай.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |