1

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

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

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

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

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

Спасибо.

Hernan

+0

У меня есть cpp размером 2,4 МБ, который содержит десятки массивов, похожих на ваши. Большинство из них небольшие (например, 5kb), но самые большие - 400kb. Скомпилируется через 1-2 секунды с VS 2008 и 2010. Я предполагаю, что у вас другая проблема. – nusi

ответ

0

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

0

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

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

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

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

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

Только обратите внимание, что SizeOf (данные) в этом случае будет только размером указателя и SizeOf (bdata) будет вместо размера изображения, но округляется до кратного размера строки ,

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

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

Смежные вопросы