我在C ++ 11中编写程序,它分析国际象棋的位置并计算一些有趣的统计数据。我加载的数据被格式化为结构
struct board{
board(long int hash1,long int hash2);
};
我将所有内容存储在另一个结构中
struct data_struct{
vector<board> allboards;
void read_data(char* filename);
//other member functions
};
以前我正在读取文本文件中的数据,但是我正在使用文件I / O很昂贵的计算机集群,我必须使用不同的设置但相同的数据多次执行相同的程序。所以我认为对数据进行硬编码并重载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 :(得分:0)
C ++ 11?我会替换你的data_struct构造函数
data_struct::data_struct(){
allboards.emplace_back(2315678, 6235756);
allboards.emplace_back(464135138, 1563135);
\\5000 more lines like this
}
......作为最便宜的解决方案。它可能会在一定程度上缩短编译时间,并且肯定应该有助于缩短运行时间。
为了更好的改进,你有必要考虑initialization list,这样你就可以根据需要提供所有这些数字,但这需要对data_struct构造函数进行重要的重做。看看下面的主题......你最终可能希望将其转换为
data_struc someChessData;
someChessData.allboards =
{
{2315678, 6235756},
{464135138, 1563135},
...,
{more_n1, more_n2}
};
更新:当然是初始化列表,我做了上面的修复,只是尝试使用这样的构造分配allboards。
答案 1 :(得分:0)
如果数据不变,我建议使用static
const
struct
个数组。
通常以最有效的方式在main
之前初始化数组。编译器可以创建数据表,您的代码可以直接访问数据表。
如果你真的需要一个矢量,你可以从数组中构造一个矢量。