首先给你一些背景知识:我有一些研究代码执行蒙特卡罗模拟,重要的是我迭代一组对象,从他们的表面计算一些向量然后为每个向量迭代我再次收集对象以查看向量是否击中另一个对象(类似于光线跟踪)。伪代码看起来像这样
for each object {
for a number of vectors {
do some computations
for each object {
check if vector intersects
}
}
}
由于对象的数量可能非常大并且光线的数量更大,我认为优化迭代对象集合的方式是明智的。我创建了一些测试数组,列表和向量的测试代码,并且我的第一个测试用例发现向量迭代器的速度大约是数组的两倍,但是当我在代码中实现向量时,它比我以前使用的数组慢一些。
所以我回到测试代码并增加了每个循环调用的对象函数的复杂性(一个虚函数等同于'检查向量是否相交')我发现当函数的复杂性增加了执行时间数组和向量之间的差距减小,直到最终阵列更快。
有谁知道为什么会这样?看起来很奇怪循环内的执行时间会影响外循环运行时间。
答案 0 :(得分:1)
您测量的是数组和向量中访问元素的开销差异。 (以及它们的创建/修改等......取决于您正在进行的操作)。
编辑:根据您使用的平台/操作系统/库,它会有所不同。
答案 1 :(得分:0)
它可能取决于向量迭代器的实现。有些实现比其他实现更好。 (Visual C ++ - 至少是旧版本 - 我在看你。)
答案 2 :(得分:0)
我认为我目睹的时差实际上是由于指针处理代码中的错误。在进行一些修改以使代码更具可读性之后,无论容器如何,迭代都花费大约时间(给出或取1%)。这是有道理的,因为所有容器都具有相同的访问机制。
但是我注意到在OpenMP架构中向量运行速度稍慢,这可能是由于每个线程的开销都维护着它自己的迭代器副本。