我正在重写我在学校学到的所有数据结构,以加强我对计算机科学基础知识的理解,但我正在尝试优化我在年轻时创建的幼稚实现。
这引出了一个问题:
我的链表实现中有这几行,其中两个变量都使用了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
的比较应该是一个非常相似的过程,可能需要大约相同的时间。
答案 0 :(得分:6)
从我对指针的理解(很少),使用它们的任何操作都相当昂贵
这一般情况并非如此:虽然间接级别(即通过指针访问某些内容)确实有成本,但现代硬件会优化它以至于除了最极端之外没有办法告诉你案例。积极的缓存使这种差异更小,因此称间接访问“相当昂贵”并不准确。
然而,在你的情况下,它甚至比那更简单:根本没有间接发生!您正在检查指针本身的值,而不是它指向的值,因此检查指针和检查长度几乎没有区别。指针可以是8个字节,而长度可以是4个字节,但是你无法分辨出现代CPU的时间差异。
答案 1 :(得分:1)
我猜两者都是一样的。在两种情况下,您基本上都在进行逻辑比较。指针也是一个变量。它只包含地址,与其他变量位于同一内存区域。
然而,内心深处(装配)第一种情况可能会更慢,因为它使用的是两个变量而不是一个。