Определение, какие объектные файлы вызвали .dll увеличение размера [C++]

Дирк и Изельзер уже предоставили ответы. Дирка, безусловно, самый простой, но в моей системе, по крайней мере, он немного медленнее, вероятно, потому что поднабор векторов с проверкой [ и length дешев (и, согласно источнику, head использует length, дважды на самом деле):

> x <- rnorm(1000)
> system.time(replicate(50000, y <- head(x, -1)))
   user  system elapsed 
   3.69    0.56    4.25 
> system.time(replicate(50000, y <- x[-length(x)]))
   user  system elapsed 
  3.504   0.552   4.058

Этот шаблон поддерживается для больших длин векторов и большего количества повторений. YMMV. Разборчивость head, безусловно, превосходит предельное улучшение производительности [ в большинстве случаев.

6
задан Chris Hamons 3 June 2009 в 01:20
поделиться

4 ответа

Если gcc, objdump . Если визуальная студия, dumpbin .

Я бы предложил провести сравнение результатов работы инструмента для старой (маленькой) библиотеки и новой (большой) библиотеки.

7
ответ дан 16 December 2019 в 21:45
поделиться

Поиск в Google за 1 минуту дал мне страницу, которую я не могу отобразить. Погуглите это, и это будет ваша первая ссылка с 01.06.2009: tsql fix "столбец идентификаторов"

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

Если ваша таблица контактов является вашей ЕДИНСТВЕННОЙ таблицей или имеет НУЛЬ отношений на основе этого поля идентификатора, вы можете установить для свойства Identity значение NO, изменить нумерацию значений с 1 на COUNT (ID), затем установите для свойства Identity значение YES и повторно установите идентификатор для завершения, используя:

DECLARE @MaxID INT

SELECT @MaxID = COUNT (ID) FROM TableID

DBCC CHECKIDENT ('TableID', RESEED, @MaxID )

В этом сценарии вы можете использовать приведенный выше сценарий повторного заполнения после каждого набора удалений (но измените COUNT (ID) на MAX (ID) после того, как все будет изначально и правильно настроено, это немного повысит скорость по мере того, как таблица получит больше) до любых дополнительных вставок или обновлений ограничений внешнего ключа. Убедитесь, что вы используете ТРАНЗАКЦИИ, обернутые вокруг блоков удаления и повторного заполнения, и убедитесь, что таблица допускает только синхронные транзакции, это предотвратит размещение любых данных в середине повторного заполнения.

Сложный, а? Вот почему лучше начинать с правильной ноги. ;

  • Используете ли вы платформу * nix или платформу Windows?
  • Какой компилятор вы используете?
  • Был ли компилятор недавно изменен?
  • Был ли недавно добавлен флаг -g? (очевидный вопрос 1)
  • Был ли предмет ранее очищен? (очевидный вопрос 2)
  • Был ли объект ранее динамически связан? (очевидный вопрос 3)

Изменить: Если код находится в SCM, можете ли вы проверить версию источника, которая предоставила вам меньший объект. Затем сравните:

  1. размер исходных деревьев, выполнив du -sk на старом исходном дереве, а затем на новом исходном дереве, ничего не построив.
  2. количество файлов, выполнив что-то вроде find. / tree_top (-name * .h -o -name * .cpp) | wc -l
  3. расположение увеличенного количества файлов путем выполнения find ./tree_top (-name * .h -o -name * .cpp) -print | сортировать> список деревьев , а затем сделайте то же самое для нового дерева большего размера. Выполнение простого sdiff покажет любое большое количество новых файлов.
  4. размер базы кода, даже простой подсчет конечных точек с запятой, даст вам хороший базовый механизм для сравнения между ними.
  5. Makefiles или построить env.

HTH

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

HTH

BTW 12110] ура,

0
ответ дан 16 December 2019 в 21:45
поделиться

В Linux должно быть довольно легко увидеть, были ли добавлены новые файлы с рекурсивным различием. Они, безусловно, увеличат размер библиотеки. Затем вы можете использовать инструмент командной строки size в Linux, чтобы получить размеры каждого из новых объектных файлов и просуммировать их. Затем сравните эту сумму с увеличением вашей библиотеки и проверьте, насколько она отличается.

1
ответ дан 16 December 2019 в 21:45
поделиться

keysersoze's answer (compare the output of objdump or dumpbin) is correct. Another approach is to tell the linker to produce a map file, and compare the map files for the old and new versions of the DLL.

  • MSVC: link.exe /MAP
  • GCC and binutils: ld -M (or gcc -Wl,-M)
0
ответ дан 16 December 2019 в 21:45
поделиться
Другие вопросы по тегам:

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