从Linked List获取入口/节点最快

时间:2015-02-08 14:34:23

标签: java optimization doubly-linked-list

LinkedList.java我找到了这种获取条目的方法。

/**
 * Returns the indexed entry.
 */
private Entry<E> entry(int index) {
    if (index < 0 || index >= size)
        throw new IndexOutOfBoundsException("Index: "+index+
                                            ", Size: "+size);
    Entry<E> e = header;
    if (index < (size >> 1)) {
        for (int i = 0; i <= index; i++)
            e = e.next;
    } else {
        for (int i = size; i > index; i--)
            e = e.previous;
    }
    return e;
}

我的错误是:

    if (index < (size >> 1))

为什么这里有一点移位操作?这样的事情不是最优的吗?

if (index < (size / 2)) {
    for (int i = 0; i <= index; i++)
        e = e.next;
} else {
    for (int i = size; i > index; i--)
        e = e.previous;
}

由于

if (index < (size / 2))

会保证我们要求的索引位于列表的前半部分。

2 个答案:

答案 0 :(得分:1)

在代码示例中没有理由进行一次右移:除以2将具有相同的性能,并且可能比位移的可读性更好。这种微优化在C的旧时代非常普遍,但现在每个优化器都值得为你做替代。

答案 1 :(得分:0)

其实没有。如果在硬件级别非常快,则转换操作。这就像连接线(位)并丢弃移位线。这仅适用于整数运算和“基数2分区”,因此请注意。