【发布时间】:2010-03-18 04:29:17
【问题描述】:
首先给你一些背景知识:我有一些执行蒙特卡罗模拟的研究代码,重要的是我遍历一组对象,从它们的表面计算一些向量,然后对于我遍历的每个向量再次收集对象以查看矢量是否击中另一个对象(类似于光线追踪)。伪代码看起来像这样
for each object {
for a number of vectors {
do some computations
for each object {
check if vector intersects
}
}
}
由于对象的数量可能非常大,而光线的数量甚至更大,我认为优化迭代对象集合的方式是明智的。我创建了一些测试代码来测试数组、列表和向量,并且在我的第一个测试用例中发现向量迭代器的速度大约是数组的两倍,但是当我在代码中实现向量时,它比我之前使用的数组要慢一些。
所以我回到测试代码并增加了每个循环调用的对象函数的复杂性(一个相当于“检查向量是否相交”的虚拟函数),我发现当函数的复杂性增加执行时间时数组和向量之间的差距缩小,直到最终数组更快。
有人知道为什么会这样吗?循环内部的执行时间会影响外部循环的运行时间,这似乎很奇怪。
【问题讨论】:
-
“由于对象的数量可能非常大,而光线的数量甚至更大,我认为优化对象集合的迭代方式是明智的。” - 我认为您在这种情况下的一般反应应该是优化算法(替换为具有更好复杂性的算法)。你可以随心所欲地优化冒泡排序的循环机制,但随着集合大小的增长,快速排序同样会击败它。
-
算法无法进一步优化,但我正在同时执行此操作。由于通过对象的大量迭代,我认为这会给我一些简单的运行时间减少。然而,它所做的只是给我留下了一个问题,即为什么向量迭代时间会受到它调用的函数的复杂性或运行时间的影响。
标签: c++ optimization iteration