Какой самый быстрый способ получить только предварительно обработанный исходный код с MSVC? - PullRequest
3 голосов
/ 21 декабря 2010

Я пытаюсь найти самый быстрый способ получить полный предварительно обработанный исходный код (мне не нужна # line информация, другие комментарии, только необработанный исходный код) для исходного файла C.

Iу меня есть следующая небольшая тестовая программа, которая включает в себя только заголовочный файл Windows (mini.c):

#include <windows.h>

Используя Microsoft Visual Studio 2005, я запускаю эту команду:

cl /nologo /P mini.c

на создание файла mini.i размером 2,5 МБ уходит 6 секунд;изменение этого значения на

cl /nologo /EP mini.c > mini.i

(которое пропускает комментарии и информацию #line) занимает всего 0,5 секунды, чтобы записать 2,1 МБ вывода.

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

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

Может быть, есть выделенный двоичный файл препроцессора или другие параметры командной строки, которые могут помочь?

ОБНОВЛЕНИЕ: Одна идея, которая только что пришла мне в голову: определить макрос WIN32_LEAN_AND_MEAN , чтобы убрать множество редко нужного кода.Это ускоряет запуск вышеуказанного препроцессора примерно в 3 раза.

Ответы [ 3 ]

1 голос
/ 21 декабря 2010

Вы постоянно обрабатываете один и тот же исходный файл (<windows.h>), который, в свою очередь, извлекает множество других файлов. <windows.h> находится в каталоге SDK по умолчанию.

Теперь обработка этого неизменного файла занимает серьезное время. Тем не менее, вы можете рассчитывать на то, что он не изменится - в конце концов, это часть публичного интерфейса. Следовательно, вы можете предварительно обработать его - например, удалить комментарии - и передать эту версию в cl /EP.

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

Наконец, измерьте время, чтобы записать вывод в NUL. Вы не должны включать время, необходимое для записи mini.i на диск, так как вы намереваетесь направить вывод в md5sum.

0 голосов
/ 21 декабря 2010

Параметр / P существует уже много лет, он создает файл .i, а не объектный файл.

0 голосов
/ 21 декабря 2010

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

...