2009-06-30 276 views
3

我正在用Java編寫代碼,我根據string是否以某些字符開頭,而通過dataset循環播放,而我的dataset預計會很大。「startsWith」比「indexOf」更快嗎?

我想知道startsWith是否比indexOf更快。我做了2000個記錄的實驗,但沒有發現任何區別。

回答

-2
public class Test 
{ 
    public static void main(String args[]) { 

    long value1 = System.currentTimeMillis(); 
    for(long i=0;i<100000000;i++) 
    { 
     "abcd".indexOf("a"); 
    } 
    long value2 = System.currentTimeMillis(); 
    System.out.println(value2-value1); 


    value1 = System.currentTimeMillis(); 
    for(long i=0;i<100000000;i++) 
    { 
     "abcd".startsWith("a"); 
    } 
    value2 = System.currentTimeMillis(); 
    System.out.println(value2-value1); 
    } 
} 

與這段代碼和PERF爲startsWith測試它似乎更好,爲明顯的原因,它並沒有通過字符串遍歷。但是,在最好的情況下都應該執行關閉,而在最壞的情況下startsWith永遠比的indexOf有更好的表現

2

也許,如果它不匹配,它可能會停止查找,而indexOf需要在字符串的稍後查找出現。

5

即使不看到源,它應當清楚的是startsWith至少快於大字符串和短圖案:

(b)的結合a.startsWith的運行時間是b的長度。在最多檢查到第一個b字符後,搜索結束。

a.indexOf(b)的運行時間較長(取決於actual algorithm)。每個算法至少有一個運行時間取決於a的長度。粗略地說,你可以說,你必須查看每個角色一次來檢查模式是否在該位置開始。

但是,如果您真的在實踐中看到不同,它將一如既往地取決於實際使用情況。衡量現實生活中的差異永遠不會是壞事。

+1

我認爲你的第一句話是倒退...... * startsWith *至少對於大字符串和短格式來說更快...... – 2009-06-30 06:51:04

+1

Jon Skeet是對的。我改變了它。 – dmeister 2009-06-30 07:34:03

6

一般情況下,微型優化的黃金法則適用於這裏:

「措施,不要猜測」。

與所有這種類型的優化一樣,兩個調用之間的差異幾乎肯定不會影響,除非您檢查數以百萬計的字符長度爲幾萬個字符。

在您的代碼上運行一個分析器,並且只有在您可以測量出它降低速度時才優化此調用。直到那時,使用更易讀的選項(在這種情況下,startsWith)。一旦你知道這個模塊正在減慢你的速度,那麼試試這兩個模塊,並使用更快的模塊。沖洗。重複;-)

在學術上,我的猜測是startsWith可能會使用indexOf來實現。檢查源代碼,看看你是否感興趣。 (原來這個startsWith並沒有調用indexOf)

+0

我真的*真的*希望startsWith沒有用indexOf實現。考慮「一些非常長的字符串,它不以x開始」.startsWith(「x」) - 檢查第一個字符後應該返回有效的實現,而使用indexOf可能需要查看整個字符串。 – 2009-06-30 06:56:11

9

startsWith只需要檢查字符串開頭的存在情況 - 它的工作量減少了,所以它應該更快。

我的猜測是你的2000個記錄在幾毫秒內完成(如果有的話)。無論何時您想將一種方法與另一種方法進行基準比較,請嘗試在足夠的時間內完成,以便時間差異顯着。我發現10-30秒足以顯示出明顯的改善,但足夠短以使其能夠多次運行測試。 (如果這是一個嚴肅的調查中,我大概會嘗試更長的時間我的大部分標杆是爲了好玩。)

另外,還要確保你有不同的數據 - indexOfstartsWith應該有大致相同的運行時間indexOf返回0的情況下。所以如果你所有的記錄都符合這個模式,那麼你並沒有真正地進行測試。 (當然,我不知道你的測試是否屬於這種情況 - 這只是需要注意的一點。)

0

您提到數據集預計會很大。所以我敢打賭,很多performanve會進入這個數據集並在內存中處理它。這意味着使用一個或另一個不會改變顯着的性能。但是如果這對你很重要,你可以編寫自己的startWith方法,這個方法可能比標準庫方法快得多,或者至少你知道完成了什麼。

1

startsWith比的indexOf == 0更清晰

你有沒有確定測試的性能瓶頸,其你需要犧牲可讀性?