【发布时间】: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 的对数输入上运行了几次,总的来说,method2 比method1 快(尽管不多——只有区区的 1us)。
经过一番思考,我认为这是有道理的,因为指针在我的架构上是 8 字节的,与 long int 的大小相同。因此,与NULL 的比较应该是一个非常相似的过程,并且可能需要大约相同的时间。
【问题讨论】:
-
第二个似乎更快,因为没有分配。但这只是猜测。测量以找出答案。
-
在这两种情况下,都会将较小的值与零进行比较。可能存在边际差异,但即使存在一些极其巨大的相对差异,对您的代码的影响也很可能无法衡量。不过,请测量以确定您是否确实可以看到任何差异。
-
@zenith 以后仍然需要
temp变量。我说的是if声明。 -
@erip 那么,将其添加到问题中。顺便说一句
if(!head)也是可能的。 -
@zenith:现代编译器不关心这样的分配。对他们来说,它只是说“从现在开始,特定值有 两个 名称”。例如。如果变量在寄存器中,则对于下一行代码,两个名称都指向同一个寄存器。原因是改组名称很便宜(因为名称仅供编译器使用)并且实际上将值从一个内存位置移动到另一个内存位置需要 CPU 工作。
标签: c++ performance pointers