【问题标题】:Speed of accessing a pointer访问指针的速度
【发布时间】:2015-03-25 05:52:38
【问题描述】:

我正在重写我在学校学到的所有数据结构作为练习,以加强我对计算机科学基础知识的理解,但我正在尝试优化我年轻时创建的幼稚实现。

这让我想到一个问题:

我的链表实现中有这几行,其中两种变体都使用了 temp...

Node<T> *temp = head;

if(temp == nullptr) {
    ...
}

... // temp used here

我的链表也有一个属性long listSize,所以上面一行是类比

if(!listSize) {
   ...
}

... // temp used here, too.

这很明显。 (对我来说)不太明显的是,其中哪一个对计算机来说更快。

根据我对指针的了解(很少),对指针的任何操作都相当昂贵,这使我相信前者可能不如后者优化;但是,我并不完全确定。

谁能帮我消除这种细微差别?

谢谢, erip

编辑

发布后,我决定设置一个实验。我决定进行第一个实现method2 和第二个实现method1。我在大小从 10M 到 1B 的对数输入上运行了几次,总的来说,method2method1 快(尽管不多——只有区区的 1us)。

经过一番思考,我认为这是有道理的,因为指针在我的架构上是 8 字节的,与 long int 的大小相同。因此,与NULL 的比较应该是一个非常相似的过程,并且可能需要大约相同的时间。

【问题讨论】:

  • 第二个似乎更快,因为没有分配。但这只是猜测。测量以找出答案。
  • 在这两种情况下,都会将较小的值与零进行比较。可能存在边际差异,但即使存在一些极其巨大的相对差异,对您的代码的影响也很可能无法衡量。不过,请测量以确定您是否确实可以看到任何差异。
  • @zenith 以后仍然需要temp 变量。我说的是if 声明。
  • @erip 那么,将其添加到问题中。顺便说一句if(!head) 也是可能的。
  • @zenith:现代编译器不关心这样的分配。对他们来说,它只是说“从现在开始,特定值有 两个 名称”。例如。如果变量在寄存器中,则对于下一行代码,两个名称都指向同一个寄存器。原因是改组名称很便宜(因为名称仅供编译器使用)并且实际上将值从一个内存位置移动到另一个内存位置需要 CPU 工作。

标签: c++ performance pointers


【解决方案1】:

根据我对指针的了解(很少),对指针的任何操作都相当昂贵

这通常是不正确的:尽管间接级别(即通过指针访问某些内容)确实有成本,但现代硬件将其优化到除了最极端的情况外,您无法完全判断案例。积极的缓存使这种差异变得更小,因此称间接访问“相当昂贵”是不准确的。

但是,在您的情况下,它甚至比这更简单:根本没有间接发生!您正在检查指针本身的值,而不是它所指向的值,因此检查指针和检查长度之间几乎没有区别。指针可能是 8 个字节,而长度可能是 4 个字节,但在现代 CPU 上您无法分辨时间差异。

【讨论】:

    【解决方案2】:

    我猜两者都是一样的。在这两种情况下,您基本上都是在进行逻辑比较。指针也是一个变量。它只包含地址,并且与其他变量位于同一内存区域。

    但是,深入(汇编)第一种情况可能会更慢,因为它使用两个变量而不是一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多