gpt4 book ai didi

c++ - 哪些因素使迭代器在 Debug模式下如此缓慢(VC++ 2012)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:31 26 4
gpt4 key购买 nike

我有一个包含 10000 个随机数(mod 100)的 vector ,我想计算其中两个数字之和为 100 的对数。我写了以下内容:

auto noPairsSumTo100 = 0;
const auto itEnd = end(myNums);
for (auto it1 = begin(myNums); it1 != itEnd ; ++it1) {
for (auto it2 = it1; it2 != itEnd ; ++it2) {
if (*it1 + *it2 == 100) {
noPairsSumTo100 ++;
}
}
}

在我的机器上,这需要大约 21.6 秒才能在 Debug模式下运行。如果我设置 _ITERATOR_DEBUG_LEVEL=0(将 _SECURE_SCL 和 _HAS_ITERATOR_DEBUGGING 都设置为 0),执行时间将减少到 ~9.5 秒。替换 !=< 的比较将时间进一步缩短至约 8.5 秒。

如果我通过像这样索引 vector 来实现相同的算法:

auto noPairsSumTo100 = 0;
const auto itEnd = end(myNums);
for (auto index1 = 0; index1 < noTerms; ++index1) {
for (auto index2 = index1; index2 < noTerms; ++index2) {
if (myNums[index1] + myNums[index2] == 100) {
noPairsSumTo100 ++;
}
}
}

在 Debug模式下运行大约需要 2.1 秒。我认为这与迭代器使用之外的算法一样接近。我的问题是,是什么让第一个实现比第二个长 4 倍?

请注意,两个版本的算法在 Release模式下运行大约需要 34 毫秒,因此差异已被优化。

最佳答案

撇开边界检查不谈,STL 代码的调试版本会产生大量的函数调用。一些无辜的台词,例如:

if (a.empty())

可以产生多达 8 个(或更多)函数调用。一些(全部?)STL 实现根本没有针对调试构建进行优化。

STL 的一个常见性能问题是开发人员认为函数内联始终有效。它没有。如果太多的内联函数被调用,底层的函数就不会被内联,并且你会因为函数调用的开销而对性能造成巨大的影响。当有容器的容器时,这是很常见的:

map< string, map< int, string>>

在外部映射上的操作可以使内联函数保持为正常函数。

关于c++ - 哪些因素使迭代器在 Debug模式下如此缓慢(VC++ 2012),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19737827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com