HashSet vs. List performance

前端 未结 12 2396
小鲜肉
小鲜肉 2020-11-22 09:19

It\'s clear that a search performance of the generic HashSet class is higher than of the generic List class. Just compare the has

12条回答
  •  醉梦人生
    2020-11-22 09:43

    Just thought I'd chime in with some benchmarks for different scenarios to illustrate the previous answers:

    1. A few (12 - 20) small strings (length between 5 and 10 characters)
    2. Many (~10K) small strings
    3. A few long strings (length between 200 and 1000 characters)
    4. Many (~5K) long strings
    5. A few integers
    6. Many (~10K) integers

    And for each scenario, looking up values which appear:

    1. In the beginning of the list ("start", index 0)
    2. Near the beginning of the list ("early", index 1)
    3. In the middle of the list ("middle", index count/2)
    4. Near the end of the list ("late", index count-2)
    5. At the end of the list ("end", index count-1)

    Before each scenario I generated randomly sized lists of random strings, and then fed each list to a hashset. Each scenario ran 10,000 times, essentially:

    (test pseudocode)

    stopwatch.start
    for X times
        exists = list.Contains(lookup);
    stopwatch.stop
    
    stopwatch.start
    for X times
        exists = hashset.Contains(lookup);
    stopwatch.stop
    

    Sample Output

    Tested on Windows 7, 12GB Ram, 64 bit, Xeon 2.8GHz

    ---------- Testing few small strings ------------
    Sample items: (16 total)
    vgnwaloqf diwfpxbv tdcdc grfch icsjwk
    ...
    
    Benchmarks:
    1: hashset: late -- 100.00 % -- [Elapsed: 0.0018398 sec]
    2: hashset: middle -- 104.19 % -- [Elapsed: 0.0019169 sec]
    3: hashset: end -- 108.21 % -- [Elapsed: 0.0019908 sec]
    4: list: early -- 144.62 % -- [Elapsed: 0.0026607 sec]
    5: hashset: start -- 174.32 % -- [Elapsed: 0.0032071 sec]
    6: list: middle -- 187.72 % -- [Elapsed: 0.0034536 sec]
    7: list: late -- 192.66 % -- [Elapsed: 0.0035446 sec]
    8: list: end -- 215.42 % -- [Elapsed: 0.0039633 sec]
    9: hashset: early -- 217.95 % -- [Elapsed: 0.0040098 sec]
    10: list: start -- 576.55 % -- [Elapsed: 0.0106073 sec]
    
    
    ---------- Testing many small strings ------------
    Sample items: (10346 total)
    dmnowa yshtrxorj vthjk okrxegip vwpoltck
    ...
    
    Benchmarks:
    1: hashset: end -- 100.00 % -- [Elapsed: 0.0017443 sec]
    2: hashset: late -- 102.91 % -- [Elapsed: 0.0017951 sec]
    3: hashset: middle -- 106.23 % -- [Elapsed: 0.0018529 sec]
    4: list: early -- 107.49 % -- [Elapsed: 0.0018749 sec]
    5: list: start -- 126.23 % -- [Elapsed: 0.0022018 sec]
    6: hashset: early -- 134.11 % -- [Elapsed: 0.0023393 sec]
    7: hashset: start -- 372.09 % -- [Elapsed: 0.0064903 sec]
    8: list: middle -- 48,593.79 % -- [Elapsed: 0.8476214 sec]
    9: list: end -- 99,020.73 % -- [Elapsed: 1.7272186 sec]
    10: list: late -- 99,089.36 % -- [Elapsed: 1.7284155 sec]
    
    
    ---------- Testing few long strings ------------
    Sample items: (19 total)
    hidfymjyjtffcjmlcaoivbylakmqgoiowbgxpyhnrreodxyleehkhsofjqenyrrtlphbcnvdrbqdvji...
    ...
    
    Benchmarks:
    1: list: early -- 100.00 % -- [Elapsed: 0.0018266 sec]
    2: list: start -- 115.76 % -- [Elapsed: 0.0021144 sec]
    3: list: middle -- 143.44 % -- [Elapsed: 0.0026201 sec]
    4: list: late -- 190.05 % -- [Elapsed: 0.0034715 sec]
    5: list: end -- 193.78 % -- [Elapsed: 0.0035395 sec]
    6: hashset: early -- 215.00 % -- [Elapsed: 0.0039271 sec]
    7: hashset: end -- 248.47 % -- [Elapsed: 0.0045386 sec]
    8: hashset: start -- 298.04 % -- [Elapsed: 0.005444 sec]
    9: hashset: middle -- 325.63 % -- [Elapsed: 0.005948 sec]
    10: hashset: late -- 431.62 % -- [Elapsed: 0.0078839 sec]
    
    
    ---------- Testing many long strings ------------
    Sample items: (5000 total)
    yrpjccgxjbketcpmnvyqvghhlnjblhgimybdygumtijtrwaromwrajlsjhxoselbucqualmhbmwnvnpnm
    ...
    
    Benchmarks:
    1: list: early -- 100.00 % -- [Elapsed: 0.0016211 sec]
    2: list: start -- 132.73 % -- [Elapsed: 0.0021517 sec]
    3: hashset: start -- 231.26 % -- [Elapsed: 0.003749 sec]
    4: hashset: end -- 368.74 % -- [Elapsed: 0.0059776 sec]
    5: hashset: middle -- 385.50 % -- [Elapsed: 0.0062493 sec]
    6: hashset: late -- 406.23 % -- [Elapsed: 0.0065854 sec]
    7: hashset: early -- 421.34 % -- [Elapsed: 0.0068304 sec]
    8: list: middle -- 18,619.12 % -- [Elapsed: 0.3018345 sec]
    9: list: end -- 40,942.82 % -- [Elapsed: 0.663724 sec]
    10: list: late -- 41,188.19 % -- [Elapsed: 0.6677017 sec]
    
    
    ---------- Testing few ints ------------
    Sample items: (16 total)
    7266092 60668895 159021363 216428460 28007724
    ...
    
    Benchmarks:
    1: hashset: early -- 100.00 % -- [Elapsed: 0.0016211 sec]
    2: hashset: end -- 100.45 % -- [Elapsed: 0.0016284 sec]
    3: list: early -- 101.83 % -- [Elapsed: 0.0016507 sec]
    4: hashset: late -- 108.95 % -- [Elapsed: 0.0017662 sec]
    5: hashset: middle -- 112.29 % -- [Elapsed: 0.0018204 sec]
    6: hashset: start -- 120.33 % -- [Elapsed: 0.0019506 sec]
    7: list: late -- 134.45 % -- [Elapsed: 0.0021795 sec]
    8: list: start -- 136.43 % -- [Elapsed: 0.0022117 sec]
    9: list: end -- 169.77 % -- [Elapsed: 0.0027522 sec]
    10: list: middle -- 237.94 % -- [Elapsed: 0.0038573 sec]
    
    
    ---------- Testing many ints ------------
    Sample items: (10357 total)
    370826556 569127161 101235820 792075135 270823009
    ...
    
    Benchmarks:
    1: list: early -- 100.00 % -- [Elapsed: 0.0015132 sec]
    2: hashset: end -- 101.79 % -- [Elapsed: 0.0015403 sec]
    3: hashset: early -- 102.08 % -- [Elapsed: 0.0015446 sec]
    4: hashset: middle -- 103.21 % -- [Elapsed: 0.0015618 sec]
    5: hashset: late -- 104.26 % -- [Elapsed: 0.0015776 sec]
    6: list: start -- 126.78 % -- [Elapsed: 0.0019184 sec]
    7: hashset: start -- 130.91 % -- [Elapsed: 0.0019809 sec]
    8: list: middle -- 16,497.89 % -- [Elapsed: 0.2496461 sec]
    9: list: end -- 32,715.52 % -- [Elapsed: 0.4950512 sec]
    10: list: late -- 33,698.87 % -- [Elapsed: 0.5099313 sec]
    

提交回复
热议问题