Всем привет.
Я сижу под линем и занимаюсь спортивным программированием. Причем задачки я решаю на C++, который, как известно, наиболее удобен для этой цели. И я заметил, что G++ компилит мой source.cpp... Хм, не очень быстро. Если что, я пишу в Eclipse CDT на моем ноутбуке. Итак, я пробую скомпилировать такую прогу:
#include <iostream>
using namespace std;
int main()
{
long long a, b;
cin >> a >> b;
cout << a + b;
return 0;
}
И это компилится за 0.5 с (вроде быстренько).
Теперь уберем iostream, а вместо нее добавим bits/stdc++.h, который, как известно, подключает все разом. Получаем такой код:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long a, b;
cin >> a >> b;
cout << a + b;
return 0;
}
И он компилится уже 1.2 секунды за счет bits/stdc++.h. Ок. Теперь ставим компилятору флаг -std=c++11 (все-таки одиннадцатые плюсы есть за что любить), код оставляем тем же. Компилим, видим результат: 3.7 секунды. Ну... Это уже не 0.5, да и вообще следует заметить, что 3.7 секунды — это лучший результат. Более крупные коды будут компилится от 4 до 6 секунд. Это уже точно не 0.5 секунды.
Почему это критично? Потому что две компиляции кода — это уже в среднем 10 секунд. Три компиляции — 15 потерянных секунд. Для контеста, где плюс-минус минута играет роль, это критично. Я видел, что у некоторых участников компиляция при тех же флагах на примерно таком же железе занимает 1-2 секунды.
Мой вопрос сообществу звучит просто. Можно ли как-то ускорить компиляцию C++11 с помощью G++? Я думаю, это поможет не только мне.
у меня ssdшник ускорил
Не включать <bits/stdc++.h>
Надо создать pre-compiled header для
bits/stdc++.h
с теми же флагами, что используются для компиляции, положить его в какую-нибудь папку.И в команду сборки добавить
-I. -include ~bin/stdc++.h
, только здесь нужно указать полный путь до файла, а не как у меня :)Я пишу в vim-е, с некоторыми плагинами, получается очень круто, компилируется мгновенно :) Из минусов — менее понятные сообщения об ошибках. Но с этим можно жить.
До этого я писал под Visual Studio, хочу сказать, что при таком подходе, скорость написания программ выросла ощутимо.
Здесь примерно написано, как создать precompiled header из
<bits/stdc++.h>
: https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_headers.html#manual.intro.using.headers.pre.Что я делаю не так? На команду
g++ -Winvalid-pch -x c++-header -g -O2 -o ./stdc++.h.gch /usr/include/x86_64-linux-gnu/c++/4.8/bits/stdc++.h
он отвечает:In file included from <command-line>:0:0:
/usr/include/stdc-predef.h:1:0: fatal error: can’t create precompiled header ./stdc++.h.gch: Permission denied
/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
^
compilation terminated.
Preprocessed source stored into /tmp/cctVH2KK.out file, please attach this to your bugreport.
В чем ошибка?Надо
stdc++.h.gch
создавать где-то в у себя домашнем каталоге, а не в системном.