在这种情况下,为什么使用for循环的指针更高效?

时间:2017-02-28 16:19:04

标签: c# performance pointers unsafe unsafe-pointers

我没有C / C ++或相关低级语言的背景,所以我以前从未遇到过指针。我的游戏开发人员主要在C#工作,我最终决定今天早上转向一个不安全的环境,用于一些性能关键的代码部分(请不要"不要使用不安全的#34;答案因为我在做研究的时候读了这么多次,因为它已经让我在某些方面的性能提高了约6倍,到目前为止没有任何问题,而且我喜欢用反向数组做的事情。没有分配)。无论如何,在某种情况下,我预计没有差别,甚至可能会降低速度,我实际上节省了大量的时间(在某些情况下,我说的速度加倍) )。这种好处似乎随着迭代次数而减少,我不完全理解。

情况就是这样:

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

平均约15个蜱虫。

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

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

平均约需7个滴答。

正如我所提到的,我没有低水平的背景,而且我今天早上开始使用指针,至少是直接使用指针,所以我可能错过了很多信息。所以我的第一个问题是 - 为什么在这种情况下指针更具性能?它不是一个孤立的实例,当然,在与PC相关的特定时间点还有很多其他变量,但我在很多测试中都非常一致地得到这些结果。

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

没有指针:

  • 获取我
  • 的地址
  • 在地址获取价值

指针:

  • 获取i_ptr的地址
  • 从i_ptr
  • 获取i的地址
  • 在地址获取价值

在我看来,在这里使用指针肯定会有更多的开销,无论多么可以忽略不计。在这种情况下,指针如何始终比直接变量更高效?当然,这些都在堆栈中,因此它不依赖于它们最终存储的位置,而是我所知道的。

如前所述,需要注意的是,此奖金会随着迭代次数的增加而减少,而且相当快。我从以下数据中取出了极端情况来解释背景干扰。

在1000次迭代中,它们在30到34个刻度处都是相同的。

在10000次迭代时,指针慢了大约20个滴答。

跳转到10000000次迭代,指针慢了大约10000个滴答。

我的假设是减少来自我之前讨论的额外步骤,因为有一个额外的查找,这让我想起为什么它的更多表现为指针而不是在低循环计数。至少,我认为它们或多或少是相同的(我认为它们在实践中,但是数百万次重复测试的8个刻度差异对我来说是非常明确的)直到非常粗糙阈值我发现在100到1000次迭代之间。

道歉,如果我在某种程度上挑剔,或者这是一个很糟糕的问题,但我觉得好像确切知道幕后发生了什么是有益的。如果不出意外,我觉得它非常有趣!

1 个答案:

答案 0 :(得分:1)

有些用户认为测试结果很可能是由于测量不准确,而且看起来似乎是这样,至少达到一定程度。当在一千万次连续测试中取平均值时,两者的平均值通常相等,但在某些情况下,指针的使用平均为额外的滴答。有趣的是,当作为单个案例进行测试时,指针的使用始终比没有指针的执行时间更短。当然,在尝试测试的特定时间点上有许多其他变量正在发挥作用,这使得进一步追踪这一点变得毫无意义。但结果是我学到了更多关于指针的知识,这是我的主要目标,所以我对测试很满意。