Инициализация вектора структур занимает большое время компиляции

0

Я пишу программу на С++ 11, которая анализирует позиции шахмат и вычисляет некоторые интересные статистические данные. Данные, которые я загружаю, форматируются в структуру

struct board{
  board(long int hash1,long int hash2);
};

и я храню все в другой структуре

struct data_struct{
  vector<board> allboards;
  void read_data(char* filename);
  //other member functions
};

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

data_struct::data_struct(){
  allboards.push_back(board(2315678,6235756));
  allboards.push_back(board(464135138,1563135));
  \\5000 more lines like this 
}

Цифры не имеют значения, они являются хешированными представлениями состояний платы. Моя проблема в том, что компиляция этого кода занимает очень много времени. Я думаю, проблема в том, что я вызываю конструктор для платы 5000 раз, потому что, если я жестко программирую хеши как массивы, компиляция занимает не более пары секунд. Тем не менее, тогда программа должна преобразовывать эти массивы в вектор во время выполнения, что является неэлементной и потеряет память, а также время. Есть ли элегантный способ решить эту проблему, например, используя списки инициализации?

Изменение: я компилирую с помощью Mingw-w64 с включенными -O3 и -fexpensive-optimizations. Он не ускоряется без оптимизации.

  • 0
    Просто для ясности; это проблема компиляции программы или запуска программы? Если он работает медленно, попробуйте вызвать reserve (), чтобы рассчитать ожидаемый размер.
  • 0
    Проблема во времени компиляции. Он не очень большой, но занимает более минуты и довольно сильно замедляет меня при разработке / отладке кода.
Показать ещё 6 комментариев
Теги:
c++11
initialization
vector
constructor

2 ответа

0
Лучший ответ

C++ 11? Я бы заменил ваш конструктор data_struct

data_struct::data_struct(){
  allboards.emplace_back(2315678, 6235756);
  allboards.emplace_back(464135138, 1563135);
  \\5000 more lines like this 
}

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

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

data_struc someChessData;
someChessData.allboards =
{
{2315678, 6235756},
{464135138, 1563135},
...,
{more_n1, more_n2}
};

Обновление: конечно, список инициализации, я сделал исправление выше, просто попробуйте назначить все табло с такой конструкцией.

  • 4
    Как вы думаете, почему emplace_back компилируется быстрее, чем push_back?
  • 0
    Я относительно новичок в C ++ 11, поэтому у меня нет большого опыта со списками инициализации. Какой самый чистый способ инициализации вектора структур (особенно с учетом времени компиляции)?
Показать ещё 5 комментариев
0

Если данные являются постоянными, я рекомендую использовать static массив const struct s.

Массив будет инициализирован до main как правило, наиболее эффективным образом. Компилятор может создать таблицу данных, и ваш код будет напрямую обращаться к таблице данных.

Если вам действительно нужен вектор, вы можете построить вектор из массива.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню