Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net HashSet与列表性能_.net_Performance_Collections_List_Hash - Fatal编程技术网

.net HashSet与列表性能

.net HashSet与列表性能,.net,performance,collections,list,hash,.net,Performance,Collections,List,Hash,显然,genericHashSet类的搜索性能高于genericList类。只需将基于哈希的键与列表中的线性方法进行比较即可 但是,计算散列键本身可能需要一些CPU周期,因此对于少量项目,线性搜索可以成为散列集的真正替代方法 我的问题:收支平衡在哪里 为了简化场景(公平地说),让我们假设List类使用元素的Equals()方法来标识项。这取决于它。如果确切的答案真的很重要,那么做一些分析并找出答案。如果您确定集合中的元素永远不会超过一定数量,请使用列表。如果数字是无界的,请使用哈希集。盈亏平衡将

显然,generic
HashSet
类的搜索性能高于generic
List
类。只需将基于哈希的键与
列表中的线性方法进行比较即可

但是,计算散列键本身可能需要一些CPU周期,因此对于少量项目,线性搜索可以成为
散列集
的真正替代方法

我的问题:收支平衡在哪里


为了简化场景(公平地说),让我们假设
List
类使用元素的
Equals()
方法来标识项。

这取决于它。如果确切的答案真的很重要,那么做一些分析并找出答案。如果您确定集合中的元素永远不会超过一定数量,请使用列表。如果数字是无界的,请使用哈希集。

盈亏平衡将取决于计算哈希的成本。散列计算可以是琐碎的,也可以不是…:-)总有System.Collections.Specialized.HybridDictionary类帮助您不必担心盈亏平衡点。

取决于许多因素。。。列出实现、CPU架构、JVM、循环语义、equals方法的复杂性等。。。当列表变得足够大,可以有效地对(1000+个元素)进行基准测试时,基于散列的二进制查找可以轻而易举地击败线性搜索,并且差异只会从此处扩大


希望这有帮助

取决于您正在散列的内容。如果键是整数,则在哈希集更快之前,可能不需要太多项。如果您在字符串上键入它,那么它会变慢,并且取决于输入字符串

当然,你可以很容易地制定一个基准吗?

答案总是“视情况而定”。我从标签上猜你说的是C

你最好的办法是决定

  • 一组数据
  • 使用要求
  • 并编写一些测试用例

    它还取决于列表的排序方式(如果已经排序)、需要进行何种比较、列表中特定对象的“比较”操作需要多长时间,甚至还取决于您打算如何使用集合

    一般来说,最好的选择不是基于您正在处理的数据的大小,而是您打算如何访问它。您是否拥有与特定字符串或其他数据关联的每条数据?基于散列的集合可能是最好的。您存储的数据顺序重要吗,还是需要同时访问所有数据?一份定期的清单可能会更好

    其他:

    当然,我上面的评论假设“性能”意味着数据访问。还有一点需要考虑:当你说“性能”时,你在寻找什么?绩效是个人价值观吗?它是否管理大型(10000、100000或更多)值集?这是用数据填充数据结构的性能吗?删除数据?访问单个数据位?替代价值观?迭代这些值?内存使用情况?数据复制速度?例如,如果您通过字符串值访问数据,但您的主要性能要求是最小内存使用量,那么您可能会遇到冲突的设计问题。

    是否使用哈希集或列表取决于您需要如何访问集合。如果您需要保证项目的顺序,请使用列表。如果没有,请使用哈希集。让微软担心他们散列算法和对象的实现


    HashSet将访问项而不必枚举集合(其复杂性或其附近),并且由于列表保证顺序,与HashSet不同,某些项将必须枚举(复杂性为O(n))。

    您没有考虑的一个因素是GetHashcode()函数的健壮性。使用完美的哈希函数,哈希集显然会有更好的搜索性能。但是随着散列函数的减少,散列集的搜索时间也会减少

    你看错了。是的,一个列表的线性搜索将击败一个小项目数的哈希集。但性能差异通常对这么小的集合并不重要。一般来说,你需要担心的是大量的收藏品,而这正是你需要考虑的。但是,如果您已经测量了哈希集性能的真正瓶颈,那么您可以尝试创建一个混合列表/哈希集,但您可以通过进行大量实证性能测试来做到这一点,而不是问问题。

    您可以使用自动检测断点并接受空值的HybridDictionary,使其本质上与哈希集相同。

    很多人都说,一旦你达到了速度实际上是一个问题的大小,
    哈希集总是会超过
    列表,但这取决于你在做什么

    假设您有一个
    列表
    ,其中平均只有5项。在大量的周期中,如果每个周期都添加或删除一个项目,那么最好使用
    列表

    我在我的机器上做了一个测试,它必须非常小才能从
    列表中获得优势。对于短字符串列表,大小为5后的优势消失了,对于大小为20后的对象,优势消失了

    1 item LIST strs time: 617ms
    1 item HASHSET strs time: 1332ms
    
    2 item LIST strs time: 781ms
    2 item HASHSET strs time: 1354ms
    
    3 item LIST strs time: 950ms
    3 item HASHSET strs time: 1405ms
    
    4 item LIST strs time: 1126ms
    4 item HASHSET strs time: 1441ms
    
    5 item LIST strs time: 1370ms
    5 item HASHSET strs time: 1452ms
    
    6 item LIST strs time: 1481ms
    6 item HASHSET strs time: 1418ms
    
    7 item LIST strs time: 1581ms
    7 item HASHSET strs time: 1464ms
    
    8 item LIST strs time: 1726ms
    8 item HASHSET strs time: 1398ms
    
    9 item LIST strs time: 1901ms
    9 item HASHSET strs time: 1433ms
    
    1 item LIST objs time: 614ms
    1 item HASHSET objs time: 1993ms
    
    4 item LIST objs time: 837ms
    4 item HASHSET objs time: 1914ms
    
    7 item LIST objs time: 1070ms
    7 item HASHSET objs time: 1900ms
    
    10 item LIST objs time: 1267ms
    10 item HASHSET objs time: 1904ms
    
    13 item LIST objs time: 1494ms
    13 item HASHSET objs time: 1893ms
    
    16 item LIST objs time: 1695ms
    16 item HASHSET objs time: 1879ms
    
    19 item LIST objs time: 1902ms
    19 item HASHSET objs time: 1950ms
    
    22 item LIST objs time: 2136ms
    22 item HASHSET objs time: 1893ms
    
    25 item LIST objs time: 2357ms
    25 item HASHSET objs time: 1826ms
    
    28 item LIST objs time: 2555ms
    28 item HASHSET objs time: 1865ms
    
    31 item LIST objs time: 2755ms
    31 item HASHSET objs time: 1963ms
    
    34 item LIST objs time: 3025ms
    34 item HASHSET objs time: 1874ms
    
    37 item LIST objs time: 3195ms
    37 item HASHSET objs time: 1958ms
    
    40 item LIST objs time: 3401ms
    40 item HASHSET objs time: 1855ms
    
    43 item LIST objs time: 3618ms
    43 item HASHSET objs time: 1869ms
    
    46 item LIST objs time: 3883ms
    46 item HASHSET objs time: 2046ms
    
    49 item LIST objs time: 4218ms
    49 item HASHSET objs time: 1873ms
    
    以下是以图形形式显示的数据:

    代码如下:

    static void Main(string[] args)
    {
        int times = 10000000;
    
    
        for (int listSize = 1; listSize < 10; listSize++)
        {
            List<string> list = new List<string>();
            HashSet<string> hashset = new HashSet<string>();
    
            for (int i = 0; i < listSize; i++)
            {
                list.Add("string" + i.ToString());
                hashset.Add("string" + i.ToString());
            }
    
            Stopwatch timer = new Stopwatch();
            timer.Start();
            for (int i = 0; i < times; i++)
            {
                list.Remove("string0");
                list.Add("string0");
            }
            timer.Stop();
            Console.WriteLine(listSize.ToString() + " item LIST strs time: " + timer.ElapsedMilliseconds.ToString() + "ms");
    
    
            timer = new Stopwatch();
            timer.Start();
            for (int i = 0; i < times; i++)
            {
                hashset.Remove("string0");
                hashset.Add("string0");
            }
            timer.Stop();
            Console.WriteLine(listSize.ToString() + " item HASHSET strs time: " + timer.ElapsedMilliseconds.ToString() + "ms");
            Console.WriteLine();
        }
    
    
        for (int listSize = 1; listSize < 50; listSize+=3)
        {
            List<object> list = new List<object>();
            HashSet<object> hashset = new HashSet<object>();
    
            for (int i = 0; i < listSize; i++)
            {
                list.Add(new object());
                hashset.Add(new object());
            }
    
            object objToAddRem = list[0];
    
            Stopwatch timer = new Stopwatch();
            timer.Start();
            for (int i = 0; i < times; i++)
            {
                list.Remove(objToAddRem);
                list.Add(objToAddRem);
            }
            timer.Stop();
            Console.WriteLine(listSize.ToString() + " item LIST objs time: " + timer.ElapsedMilliseconds.ToString() + "ms");
    
    
    
            timer = new Stopwatch();
            timer.Start();
            for (int i = 0; i < times; i++)
            {
                hashset.Remove(objToAddRem);
                hashset.Add(objToAddRem);
            }
            timer.Stop();
            Console.WriteLine(listSize.ToString() + " item HASHSET objs time: " + timer.ElapsedMilliseconds.ToString() + "ms");
            Console.WriteLine();
        }
    
        Console.ReadLine();
    }
    
    static void Main(字符串[]args)
    {
    整数倍=10000000;
    对于(int listSize=1;listSize<10;listSize++)
    {
    列表=新列表();
    HashSet HashSet=新的HashSet();
    for(int i=0;istopwatch.start
    for X times
        exists = list.Contains(lookup);
    stopwatch.stop
    
    stopwatch.start
    for X times
        exists = hashset.Contains(lookup);
    stopwatch.stop
    
    ---------- 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]
    
    +------------+--------+-------------+-----------+----------+----------+-----------+
    | Collection | Random | Containment | Insertion | Addition |  Removal | Memory    |
    |            | access |             |           |          |          |           |
    +------------+--------+-------------+-----------+----------+----------+-----------+
    | List<T>    | O(1)   | O(n)        | O(n)      | O(1)*    | O(n)     | Lesser    |
    | HashSet<T> | O(n)   | O(1)        | n/a       | O(1)     | O(1)     | Greater** |
    +------------+--------+-------------+-----------+----------+----------+-----------+