Существует ли “функциональный профилировщик размера” там?

Мое решение - simple.h , который является частью пакета scc . Все стандартные контейнеры, карты, наборы, c-массивы можно распечатать.

14
задан Qwertie 26 June 2009 в 23:06
поделиться

4 ответа

В Linux вы можете использовать nm , чтобы показать все символы в исполняемом файле и отсортировать их в обратном порядке по размеру:

$ nm -CSr --size-sort <exe>

Параметры:

  • -C показывает имена C ++.
  • -S показывает размер символов.
  • - size-sort сортирует символы по размеру.
  • -r меняет сортировку .

Если вы хотите получить результаты для каждого пространства имен или класса, вы можете просто grep вывод для ' namespace :: ', ' namespace :: class_name :: ', и т. Д. .

Если вы хотите видеть только символы, которые определены в исполняемом файле (а не те, которые определены где-либо еще, как в библиотеках), тогда добавьте - только определенные . Сортировка по размеру должна позаботиться об этом, поскольку неопределенные символы не будут иметь размер.

Для Windows , вы по-прежнему сможете использовать nm в своих двоичных файлах, поскольку nm поддерживает двоичные файлы COFF . Вы можете установить nm через cygwin или скопировать исполняемый файл Windows в Linux и запустить там nm .

Вы также можете попробовать dumpbin ], который выводит информацию о двоичном файле в Windows. Вы можете получить информацию о символах с помощью переключателя / SYMBOLS , но не похоже, что он напрямую предоставляет информацию об их размере.

который выводит информацию о двоичном файле в Windows. Вы можете получить информацию о символах с помощью переключателя / SYMBOLS , но не похоже, что он напрямую предоставляет информацию об их размере.

который выводит информацию о двоичном файле в Windows. Вы можете получить информацию о символах с помощью переключателя / SYMBOLS , но не похоже, что он напрямую предоставляет информацию об их размере.

15
ответ дан 1 December 2019 в 10:19
поделиться

Не смотрите только на код - ресурсы легко могут привести к росту на несколько мегабайт.

1
ответ дан 1 December 2019 в 10:19
поделиться

В Windows при компиляции Visual Studio эта информация находится в вашем файле .map (он будет рядом с .pdb).

ДОБАВЛЕНО : для преобразования найденных декорированных имен в файле .map в более удобочитаемый формат, вы можете использовать утилиту undname.exe , включенную в Visual Studio. Он принимает отдельные имена в командной строке или вы можете передать ему файл .map.

Например,

Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of "?push_back@?$mini_vector@U?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@$05@@QAAXABU?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@@Z" is 

"public: void __cdecl mini_vector<struct Math::Point<struct Math::FixedPoint<14,int> >,6>::push_back(struct Math::Point<struct Math::FixedPoint<14,int> > const &)"
7
ответ дан 1 December 2019 в 10:19
поделиться

Получите карту ссылок или воспользуйтесь dumpbin , чтобы получить список символов и размеров.

Скорее всего, будет много вещей, которые вы не делаете » t строго необходимо.

ДОБАВЛЕНО: Вы получили удовлетворительный ответ? Я понял, что есть два способа, которыми люди подходят к таким проблемам:

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

] Лично я предпочитаю второе - оно дает результаты быстрее.

Вы говорите, что приложение занимает 4 МБ. Предположим, что реальный необходимый размер составляет 1 МБ (или какой-то другой размер). Это означает, что если вы выберете процедуру наугад из файла карты, она с 75% вероятностью окажется тем, что вам не нужно. Выясните, почему он был включен, и посмотрите, действительно ли он вам нужен.

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

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

1
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

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