C++运行时效率

C++运行时效率,c++,runtime,C++,Runtime,我正在用节点创建一个十六进制板。我在这段代码中的所有东西都能完美地工作。我的问题是,带星号的项目会使循环从约1秒变慢到约1分钟。这不是向量中的项目数,因为如果我除去最后一个之外的所有项目,仍然需要~1分钟。无论哪种方式,都没有运行时错误 for (x = 0; x < size; ++x) { for (y = 0; y < size; ++y) { this->nodes[x][y].neighbors = std::vector<nod

我正在用节点创建一个十六进制板。我在这段代码中的所有东西都能完美地工作。我的问题是,带星号的项目会使循环从约1秒变慢到约1分钟。这不是向量中的项目数,因为如果我除去最后一个之外的所有项目,仍然需要~1分钟。无论哪种方式,都没有运行时错误

for (x = 0; x < size; ++x)
{
    for (y = 0; y < size; ++y)
    {
        this->nodes[x][y].neighbors = std::vector<node>(6);
        if ((x == 0) && (y == 0))
        {
            this->nodes[x][y].neighbors =
            {
                nodes[x + 1][y],
                this->nodes[x][y + 1]
            };
        }
        else if ((x == 0) && (y == max))
        {
            this->nodes[x][y].neighbors =
            {
                this->nodes[x + 1][y],
                this->nodes[x][y - 1],
                this->nodes[x + 1][y - 1]
            };
        }
        else if ((x == max) && (y == 0))
        {
            this->nodes[x][y].neighbors =
            {
                this->nodes[x - 1][y],
                this->nodes[x][y + 1],
                this->nodes[x - 1][y + 1]
            };
        }
        else if ((x == max) && (y == max))
        {
            this->nodes[x][y].neighbors =
            {
                this->nodes[x - 1][y],
                this->nodes[x][y - 1]
            };
        }
        else if (y == 0 && (x != 0 && x != max))
        {
            this->nodes[x][y].neighbors =
            {
                this->nodes[x - 1][y],
                this->nodes[x + 1][y],
                this->nodes[x - 1][y + 1],
                this->nodes[x][y + 1]
            };
        }
        else if (y == max && (x != 0 && x != max))
        {
            this->nodes[x][y].neighbors =
            {
                this->nodes[x - 1][y],
                this->nodes[x + 1][y],
                this->nodes[x - 1][y - 1],
                this->nodes[x][y - 1]
            };
        }
        else if (x == 0 && (y != 0 && y != max))
        {
            this->nodes[x][y].neighbors =
            {
                this->nodes[x][y - 1],
                this->nodes[x][y + 1],
                this->nodes[x + 1][y],
                this->nodes[x + 1][y - 1]
            };
        }
        else if (x == max && (y != 0 && y != max))
        {
            this->nodes[x][y].neighbors =
            {
                this->nodes[x][y - 1],
                this->nodes[x][y + 1],
                this->nodes[x - 1][y - 1],
                this->nodes[x - 1][y]
            };
        }
        else
        {
            this->nodes[x][y].neighbors =
            {
                this->nodes[x + 1][y],
                this->nodes[x - 1][y],
                this->nodes[x][y - 1],
                this->nodes[x + 1][y - 1],
                this->nodes[x][y + 1],
                this->nodes[x - 1][y + 1]
            };
        }
    }
}

缓慢来自两个方面:

最后一个else子句受到的影响最大。 最后一个子句复制的节点项比其余的多 一些建议:

为邻居使用指针或索引,而不是节点对象。少抄袭。 为邻居设置一个固定大小的数组会更快。将显著改善局部性和记忆力。您必须为该数组添加一个邻居计数。
考虑到这个想法是跟踪你知道已经预先创建的邻居,你可能只想保留一个指向它们的引用或指针;不应像当前那样按值复制节点

您可以使用vector或vector,其各自的初始化如下:

nodes[x][y].neighbors = { ref(nodes[a][b]), ref(nodes[c][d])... };

nodes[x][y].neighbors = { &nodes[a][b], &nodes[c][d], ... };
对于指针,当您访问邻居[n]时,显然也需要取消对指针的引用


关于为什么这么慢。。。“按值复制”意味着将节点复制到邻居就是复制所有这些相邻节点的邻居,以及它们的邻居,即ad nauseum。。。随着具有长邻居层次结构的节点数量的增加,速度越来越慢。

由于除8种情况外,所有情况下都会遇到这种情况,因此它应该是消耗时间最多的情况。但是一秒对一分钟毫无意义。你的板子又多大了?马克斯和它的关系有多大?如果它们不是相同的值,我怀疑您是在错误地遍历自动变量空间。因为这是一个初始化,所以放一个单独的示例来演示这个问题似乎很简单。执行此操作,并调试此。大小为6,最大值为5。这个向量是一个6乘6的向量。max是大小为6的向量的最后一个索引。max==size吗?为什么要麻烦这个->节点[x][y]。邻居=向量6;?为什么要使用此->随处可见?-乱七八糟的。您是否已将编译器的优化打开,例如,对于大多数UNIX/Linux编译器,-O2,对于Windows编译器,-O2?节点的类定义和赋值运算符是什么?是的,那么我很怀疑您的寻址超出范围,但我会等待验证。@SchighSchagh我将它们全部更改为at,没有错误/异常。我对速度没有问题,除了else语句的最后一个元素使速度慢了100倍。甚至删除所有其他需要永远评估的元素。即使它不会生成错误。@dkimmel7您能在问题中编辑节点的定义吗?您修复了XCoodinate错误?使它能够使用引用包装器的.get方法。@dkimmel7:我明白了。。。如果无法从引用包装器使用的上下文中推导出节点类型,则可能需要显式执行此操作,而在可以推导的情况下(大多数情况下应该是这样),操作符节点将启动。