在这种情况下,为什么使用指针用于循环的循环更具性能



我没有C/C 或相关的低级语言的背景,因此我以前从未遇到过指示。我是一个主要在C#工作的游戏开发人员,我终于决定今天早上转到不安全的上下文,以获取某些关键的代码部分(并且我读过很多次,请不要"不要使用不安全"的答案在进行研究时,由于它已经使我在某些领域的表现左右造成了6倍,而且到目前为止尚无问题,而且我喜欢做一些事情,例如反向阵列而没有分配)。无论如何,在某种情况下,我期望没有差异,甚至可能降低速度,而且我在现实中节省了很多滴答(在某些情况下我在谈论的速度加倍)。这种好处似乎随迭代次数的数量减少,我不完全理解。

这就是情况:

int x = 0;
for(int i = 0; i < 100; i++)
    x++;

平均要花大约15个tick。

编辑:以下是不安全的代码,尽管我认为这是给定的。

int x = 0, i = 0;
int* i_ptr;
for(i_ptr = &i; *i_ptr < 100; (*i_ptr)++)
    x++;

平均大约需要7个滴答。

正如我提到的,我没有低级背景,至少今天早上我才开始使用指针,所以我可能缺少大量信息。因此,我的第一个查询是 - 为什么在这种情况下,指针更具性能?这不是一个孤立的实例,当然还有很多其他变量,在与PC有关的特定时间点,但是我在许多测试中都非常一致地得到这些结果。

在我的脑海中,操作就是这样:

没有指针:

  • 获得i
  • 的地址
  • 获得地址的价值

指针:

  • 获得I_PTR的地址
  • 从i_ptr获取i的地址
  • 获得地址的价值

在我的脑海中,在这里使用指针可以肯定有更多的开销,无论多么可笑。在这种情况下,指针比直接变量始终比直接变量更具性能?当然,这些都在堆栈上,因此,从我可以看出的东西都不取决于它们最终被存储的位置。

正如前面所述的,警告是,这种奖金随迭代次数而降低,而且很快。我从以下数据中取出了极端,以说明背景干扰。

在1000次迭代时,它们在30至34个tick中都相同。

在10000迭代时,指针的速度较慢约20个滴答。

跳到10000000迭代,指针的速度较慢,大约10000个tick左右。

我的假设是减少来自我前面涵盖的额外步骤循环计数。至少,我认为它们或多或少是相同的(我想它们在实践中,但是与数百万重复测试的滴答相差8个滴答物对我来说是非常确定的),直到非常粗糙的阈值i在100到1000迭代之间发现。

很抱歉,如果我有些挑剔,或者这是一个糟糕的问题,但是我觉得确切知道在引擎盖下发生了什么是有益的。如果没有别的,我认为这很有趣!

一些用户建议测试结果很可能是由于测量不准确而引起的,并且至少至少要到一个点。当经过一千万个连续测试的平均值时,两者的平均值通常相等,尽管在某些情况下,使用指针的使用平均为额外的滴答。有趣的是,当测试作为单个情况时,指针的使用的执行时间始终低于没有。当然,在尝试测试的特定时间点上,还有很多其他变量在玩耍,这使得它有些毫无意义地追求,以进一步追踪这一点。但是结果是我对指针有了更多的了解,这是我的主要目标,所以我对测试感到满意。

最新更新