Могут ли утечки памяти в C ++ негативно повлиять на загрузку процессора? - PullRequest
6 голосов
/ 03 июня 2010

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

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

Спасибо!

Ответы [ 7 ]

19 голосов
/ 03 июня 2010

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

4 голосов
/ 03 июня 2010

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

3 голосов
/ 03 июня 2010

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

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

Да, и исправьте утечку памяти, пока это просто.

1 голос
/ 03 июня 2010

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


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


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

1 голос
/ 03 июня 2010

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

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

1 голос
/ 03 июня 2010

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

0 голосов
/ 03 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...