2015-02-08 105 views
1

LinkedList.java我發現這個方法獲取條目。從LinkedList獲取條目/節點最快

/** 
* 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)) 

會答應我們的請求的索引在列表中的前半部分。

+0

尺寸>> 1和尺寸/ 2相同 – Eran 2015-02-08 14:37:04

+0

它們是等效的。但是將大小>> 1轉換爲機器碼,會產生比整數除法更快的位移。 – JuniorCompressor 2015-02-08 14:37:21

回答

1

沒有理由在代碼示例中正確地進行位移:除以2將具有相同的性能,並且可能具有比位移更好的可讀性。這種微觀優化在C的舊時代是非常普遍的,但現在每個優化器都值得它的鹽替代你。

+0

您確定,user3558040答覆說服我嗎? – 2015-02-08 14:43:11

+0

@TobiasJohansson這種轉變比分工更快,但它的編譯器的工作,而不是程序員,使得替代。 – dasblinkenlight 2015-02-08 14:47:01

0

其實沒有。如果在硬件級別速度很快,則移位操作。這就像連接電線(位),並將移位的電極分開。這隻適用於整數運算和「基2分」,所以要注意。

+0

OMG當然如果sta sta是相等的話。在我的帖子後,我的頭腦直了一秒,結果是一樣的。 但是;來自你的巨大投入,它確實更快! – 2015-02-08 14:40:38