Блог пользователя mental.cat

Автор mental.cat, история, 9 лет назад, По-русски

Всем привет.

Я сижу под линем и занимаюсь спортивным программированием. Причем задачки я решаю на 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++? Я думаю, это поможет не только мне.

  • Проголосовать: нравится
  • +53
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

у меня ssdшник ускорил

»
9 лет назад, # |
  Проголосовать: нравится +10 Проголосовать: не нравится

Не включать <bits/stdc++.h>

»
9 лет назад, # |
Rev. 5   Проголосовать: нравится +21 Проголосовать: не нравится

Надо создать pre-compiled header для bits/stdc++.h с теми же флагами, что используются для компиляции, положить его в какую-нибудь папку.

И в команду сборки добавить -I. -include ~bin/stdc++.h, только здесь нужно указать полный путь до файла, а не как у меня :)

Я пишу в vim-е, с некоторыми плагинами, получается очень круто, компилируется мгновенно :) Из минусов — менее понятные сообщения об ошибках. Но с этим можно жить.

До этого я писал под Visual Studio, хочу сказать, что при таком подходе, скорость написания программ выросла ощутимо.

»
9 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Здесь примерно написано, как создать precompiled header из <bits/stdc++.h>: https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_headers.html#manual.intro.using.headers.pre.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Что я делаю не так? На команду 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. В чем ошибка?

    • »
      »
      »
      9 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Надо stdc++.h.gch создавать где-то в у себя домашнем каталоге, а не в системном.