Разве утечки памяти C++ могут негативно влиять на использование ЦП?

У меня есть программа C++, которая имеет довольно ужасную утечку памяти, приблизительно 4 МБ / второй. Я знаю, куда это прибывает из и может зафиксировать его, но это не моя основная проблема. Моя программа поднимает очень большой объем использования ЦП, и это не работает с такой скоростью, как я хочу это к. У меня есть два различных потока в программе. Каждый отдельно берет ЦП на ~50%, который прекрасен, и другой отдельно берет ЦП на ~15%, который прекрасен. Вместе однако использование ЦП составляет 100%, и программа не может работать с такой скоростью, как это должно.

Утечка памяти может отдельно вызвать проблему как это? Я знаю, что программа в конечном счете откажет из-за пропущенной памяти, но утечка памяти сразу приводит к более медленной программе? Сразу я подразумеваю, что программа является слишком медленной в, очень запускаются, не как раз в то самое время, когда объем потребляемой памяти огромен.

Спасибо!

6
задан BradleyDotNET 16 September 2014 в 22:58
поделиться

7 ответов

Независимо от того, является ли утечка памяти причиной проблемы, ее необходимо исправить. Как только вы исправите утечку памяти, посмотрите, есть ли у вас проблема. Вы должны быть в состоянии ответить на свой собственный вопрос в этот момент.

19
ответ дан 8 December 2019 в 03:26
поделиться

Здесь есть несколько углов: 1) У вас утечки памяти. Это обязательно вызовет сбои страниц в вашем кеше, поэтому данные должны быть получены из ОЗУ / диска. Больше ввода-вывода, больше проблем. Вы используете диспетчер памяти? Если не рассмотрите возможность использования одного. Для начала посмотрите на dlmalloc.


2) Использование ЦП на 100% не может быть связано с этой проблемой. Очевидно, что лучше всего сначала исправить эту утечку, а затем использовать профилировщик [Quantify лучше, но стоит. VTune неплохой, хотя интерфейс мне не нравится. Иначе gprof неплох и бесплатный.] И посмотрите, какие части вашего кода занимают циклы ЦП.


3) Я вижу, что вы используете потоки. Синхронизировать потоки нетривиально. Посмотрите, не ждете ли вы мьютексов или чего-то подобного.

1
ответ дан 8 December 2019 в 03:26
поделиться

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

4
ответ дан 8 December 2019 в 03:26
поделиться

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

1
ответ дан 8 December 2019 в 03:26
поделиться

посмотрите на свои ошибки страницы. В Windows используйте Диспетчер задач, а в Unix / Linux попробуйте ps. Вполне вероятно, что дополнительное время процессора используется для выделения дополнительной памяти вашему процессу, и после того, как свободная физическая память будет исчерпана, ОС должна выгрузить неиспользуемые страницы на диск.

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

1
ответ дан 8 December 2019 в 03:26
поделиться

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

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

О, и устраните утечку памяти сейчас, пока это еще легко.

3
ответ дан 8 December 2019 в 03:26
поделиться

Удаление ранее выделенных фрагментов памяти должно происходить относительно быстрее, чем их выделение, и (если утечка памяти означает «потерю памяти из-за отсутствия вызова освобождения»), это не должно влиять на ваша скорость, только общее использование памяти.

Хотя, если вы выделяете огромное количество памяти каждую секунду и не выполняете должное освобождение, это может быть проблемой. У меня была такая же проблема при неправильной компиляции gtkmm + librsvg утечка ~ 5 мегабайт в секунду при перерисовке экрана, что, конечно, оказало заметное влияние на производительность.

Конечно, это не означает, что вам не следует устранять утечки памяти, если вы знаете, что они существуют. Утечки памяти могут вызвать что-то более серьезное, чем проблемы с производительностью.

0
ответ дан 8 December 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: