【发布时间】:2013-04-27 18:39:09
【问题描述】:
使用 kcachegrind 并在调试模式下运行代码,我发现我的程序的瓶颈是比较两个向量的点。
if (v1 == v2) {
// DO
}
如何提高效率?这样更好吗
if (v1[0] == v2[0]) {
if (v1 == v2) {
// DO
}
}
第一行会过滤掉一些无用的比较。
在此之前我尝试过
if (!v2.empty())
if (v1 == v2)
// DO
但是我发现它们几乎总是不是空的。所以empty()的额外时间也包括在内。
不得不说,向量的大小大多都很小。 2~4个元素。在极少数情况下,它们会扩展到 10 个。
更新: 感谢 Mats Petersson,看来通过在优化模式下编译,还有一些性能改进。
【问题讨论】:
-
你的向量的
value_type是什么? -
@mahmood 你在说,比较
vector<uint_64t>s 的 2-4 个元素是瓶颈吗?您是否有机会对调试版本进行基准测试,而不是进行优化的发布版本? -
@mahmood 在 C++ 中,优化,尤其是内联,还有循环展开,在性能方面发挥着重要作用。如果瓶颈是一件微不足道的事情,肯定会受到这些优化的影响,那么对调试版本进行基准测试就毫无意义了。
-
啊!请关闭调试(如果需要,请保持调试符号打开)以进行性能测量。
-
@mahmood 是的,这可能是个问题,优化可以彻底破坏未优化构建的直接组装。我喜欢称之为微观分析不确定性原则:你不能同时得到原始源代码中瓶颈的确切位置,以及优化代码中真正的瓶颈。
标签: c++ performance vector