Каков самый быстрый способ получить предварительно обработанный исходный код с помощью MSVC?

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

У меня есть следующая небольшая тестовая программа, которая включает только заголовочный файл 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 раза.


person Frerich Raabe    schedule 21.12.2010    source источник


Ответы (3)


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

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

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

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

person MSalters    schedule 21.12.2010
comment
Не могу заставить cl /EP написать NUL. Просто сидит и ничего не делает. - person Frerich Raabe; 21.12.2010

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

person Puppy    schedule 21.12.2010
comment
Я хорошо знаю аргументы компилятора, и многопоточная компиляция мне не помогает, так как я на самом деле ничего не компилирую. Я просто запускаю препроцессор. - person Frerich Raabe; 21.12.2010

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

person Michael Smith    schedule 21.12.2010