VC ++ время компиляции и производительность - PullRequest
1 голос
/ 02 июля 2010

Я работаю над мультиплатформенным проектом (MacOS, Linux и Windows), и у меня возникают некоторые проблемы с производительностью при попытке скомпилировать большой исходный файл в VS C ++ 2010.

Вот небольшой фон,Внутри проекта есть один файл .cpp размером 800 КБ.Размер файла вызван тем, что я компилирую массив, содержащий информацию об изображении.Итак, это огромный массив без знака, который не может быть разделен.

Итак, я работал над MacOS последние пару месяцев, поэтому я не заметил этой проблемы несколько дней назад.В MacOS и Linux gcc компилирует файл примерно за секунду, но когда я использую VC ++, это занимает около часа.

Сначала я подумал, что это было сделано самим компьютером, поскольку он не быстрый.Но потом я попробовал Cygwin и GCC 4 на одной машине, и время компиляции было почти таким же быстрым, как в MacOS.Поэтому я должен предположить, что проблема вызвана чем-то в VC ++ 2010.

Я не настраивал VC ++ ни в какой форме.Файлы проекта генерируются CMake, поэтому я считаю, что здесь должно быть место для оптимизации.Любая помощь будет оценена.

Спасибо.

Эрнан

Ответы [ 2 ]

1 голос
/ 02 июля 2010

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

0 голосов
/ 02 июля 2010

Похоже, что есть некоторая O (n ^ k) часть VC ++ с k> 1 при разборе инициализаторов массива ...

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

unsigned char bdata[][100] = {
    { 0x01, 0x02, ... , 0x63} ,
    { 0x64, 0x65, ... , 0xC7} ,
    { 0xC8, 0xC9, ... , 0x2B} ,
    ...
};
unsigned char *data = &(bdata[0][0]);

, который разбивает данные на 100-байтовые строки ... МОЖЕТ БЫТЬ VC будет анализировать / компилировать намного быстрее (просто подозрение, что я дал симптомы), и это не должно значительно измените процесс сборки.

Я не использую VC ++ 2010, поэтому не могу проверить.

Просто обратите внимание, что sizeof (data) в этом случае будет просто размером указателя, а sizeof (bdata) будет вместо размера изображения, но будет округлено до кратного размера строки .

Если эта версия работает с той же скоростью, к сожалению, код равен O (n ^ k) в количестве байтов, и вы в основном обречены, если хотите, чтобы это было скомпилировано как массив.

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

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