繁体   English   中英

std :: vector优化

[英]std::vector optimization

假设从std :: vector读取很多值的循环是我程序中的瓶颈,建议我进行更改

void f(std::vector<int> v)
{
    ...
    while (...)
    {
        ...
        int x = v[i] + v[j]
        ...
    }
}

void f(std::vector<int> v)
{
    int* p_v = &v[0];
    ...
    while (...)
    {
        ...
        int x = p_v[i] + p_v[j]
        ...
    }
}

通过绕过[]运算符,这实际上会提高性能吗?

从表面上看,每次调用此函数时复制整个向量更有可能成为瓶颈。 为什么不选择以下内容呢?

void f(const std::vector<int>& v)

无论如何,永远不要假设瓶颈在哪里-首先确定,一旦确定就调整慢速的代码。

不,那不应该影响性能。

请注意,在向量上使用“按引用传递常量”而不是“按值传递”可能会更好。

编辑:有关该语法,请参阅@Steve Townsend的答案。

不,不是实质性的。 您使代码更难阅读,而付出的代价却是(也许)微不足道的性能提升。 无论如何,如果编译器未在优化的版本中内联对operator[]的调用,我会感到惊讶。

如果不确定,请对其进行配置。 我想它永远不会出现。

几乎所有有关性能的问题的标准答案是使用探查器来查看这是否是瓶颈,并查看更改是否有帮助。 但是,在这种情况下,我认为这不是特别好的建议。 我已经看了足够多的编译器的输出,例如这样的代码,我几乎可以断言这两者将生成相同的指令流。 从理论上讲,这可能是错误的(虽然我使用过很多编译器,但肯定还有其他我没有使用过),但实际上,如果是这样,我会感到非常惊讶。 尽管可能有一条指令或两条前(循环外)有所不同,但我希望循环中的内容是相同的。

如果您只需要顺序访问vector的内容(可悲的是您的示例显示了看似随机的访问,因此这行不通,但也许只是一个示例),通过使用迭代器遍历向量。 我已经看到,即使在启用了完整编译器优化的纯数组上,此优化也有明显的不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM