Я пишу программу на С++ 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. Он не ускоряется без оптимизации.
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}
};
Обновление: конечно, список инициализации, я сделал исправление выше, просто попробуйте назначить все табло с такой конструкцией.
Если данные являются постоянными, я рекомендую использовать static
массив const
struct
s.
Массив будет инициализирован до main
как правило, наиболее эффективным образом. Компилятор может создать таблицу данных, и ваш код будет напрямую обращаться к таблице данных.
Если вам действительно нужен вектор, вы можете построить вектор из массива.