Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
C# LinkedList中的插入速度_C#_Performance_Templates_Generics_Linked List - Fatal编程技术网

C# LinkedList中的插入速度

C# LinkedList中的插入速度,c#,performance,templates,generics,linked-list,C#,Performance,Templates,Generics,Linked List,在性能测试时,我注意到了一些有趣的事情 我注意到,第一次插入LinkedList(C#泛型)要比在列表顶部进行的任何其他插入都要慢得多。我只是简单地使用C#模板LinkedList,每次插入LinkedList时都使用AddFirst()。为什么第一次插入最慢 前五个插入结果: 首次插入列表:0.0152毫秒 第二次插入列表(头部):0.0006毫秒 第三次插入列表(头部):0.0003毫秒 第四次插入列表(头部):0.0006毫秒 第五次插入列表(头部):0.0006毫秒 性能测试代码: 一

在性能测试时,我注意到了一些有趣的事情

我注意到,第一次插入LinkedList(C#泛型)要比在列表顶部进行的任何其他插入都要慢得多。我只是简单地使用C#模板LinkedList,每次插入LinkedList时都使用AddFirst()。为什么第一次插入最慢


前五个插入结果:

首次插入列表:0.0152毫秒

第二次插入列表(头部):0.0006毫秒

第三次插入列表(头部):0.0003毫秒

第四次插入列表(头部):0.0006毫秒

第五次插入列表(头部):0.0006毫秒

性能测试代码:


一次手术的时间安排是非常危险的——最轻微的口吃会对结果产生巨大的影响。此外,不清楚在此代码之前您是否使用了
LinkedList
,这意味着您将对
AddFirst
的JITting进行计时,甚至可能对其他类型的JITting进行计时

仅为第一次插入计时是相当困难的,因为一旦插入,就无法轻松重复。但是,您可以重复执行“插入和删除”计时,如下代码所示:

using System;
using System.Collections.Generic;
using System.Diagnostics;

class Program
{
    public static void Main(string[] args)
    {
        // Make sure we've JITted the LinkedList code
        new LinkedList<string>().AddFirst("ignored");

        LinkedList<string> list = new LinkedList<string>();        
        TimeInsert(list);
        list.AddFirst("x");
        TimeInsert(list);
        list.AddFirst("x");
        TimeInsert(list);
        list.AddFirst("x");        
    }

    const int Iterations = 100000000;

    static void TimeInsert(LinkedList<string> list)
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();

        Stopwatch sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            list.AddFirst("item");
            list.RemoveFirst();
        }
        sw.Stop();

        Console.WriteLine("Initial size: {0}; Ticks: {1}",
                           list.Count, sw.ElapsedTicks);
    }
}
这就是我所期望的,因为根据内部表示,在向已填充的列表添加和删除时,在连接“前一个标题”方面,还有非常稍微多的工作要做


我的猜测是,您看到的是JIT时间,但实际上,您的代码的时间不够精确,不足以发挥作用,我认为。

为单个操作计时是非常危险的-最轻微的口吃可能会对结果产生巨大的影响。此外,不清楚在此代码之前您是否使用了
LinkedList
,这意味着您将对
AddFirst
的JITting进行计时,甚至可能对其他类型的JITting进行计时

仅为第一次插入计时是相当困难的,因为一旦插入,就无法轻松重复。但是,您可以重复执行“插入和删除”计时,如下代码所示:

using System;
using System.Collections.Generic;
using System.Diagnostics;

class Program
{
    public static void Main(string[] args)
    {
        // Make sure we've JITted the LinkedList code
        new LinkedList<string>().AddFirst("ignored");

        LinkedList<string> list = new LinkedList<string>();        
        TimeInsert(list);
        list.AddFirst("x");
        TimeInsert(list);
        list.AddFirst("x");
        TimeInsert(list);
        list.AddFirst("x");        
    }

    const int Iterations = 100000000;

    static void TimeInsert(LinkedList<string> list)
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();

        Stopwatch sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            list.AddFirst("item");
            list.RemoveFirst();
        }
        sw.Stop();

        Console.WriteLine("Initial size: {0}; Ticks: {1}",
                           list.Count, sw.ElapsedTicks);
    }
}
这就是我所期望的,因为根据内部表示,在向已填充的列表添加和删除时,在连接“前一个标题”方面,还有非常稍微多的工作要做



我猜您看到的是JIT时间,但实际上您的代码的时间不够准确,因此不太有用。

我怀疑链接列表的某些资源仅在首次插入列表时分配。请显示您的基准代码。如果这只是与您的测量方式有关,我完全不会感到惊讶。可能是linkedlist的创建在内部被延迟,直到您第一次调用AddFirst()。我个人怀疑这是JIT时间。不过,我们需要查看要注释的代码。@Jon与前面的代码几乎相同。我不认为这与我如何衡量有任何关系…?我怀疑链接列表的某些资源仅在首次插入某个内容后才分配。请显示您的基准代码。如果这只是与您的测量方式有关,我完全不会感到惊讶。可能是linkedlist的创建在内部被延迟,直到您第一次调用AddFirst()。我个人怀疑这是JIT时间。不过,我们需要查看要注释的代码。@Jon与前面的代码几乎相同。我不认为这和我测量的方式有任何关系…?哦,哇哈!在你测量时间之前进行垃圾收集是非常明智的。很酷!Jon,在调用Gc.Collect和Waitforpendingfinalizers()之后,或者在CLR执行此方法并要求Gc进行一些收集时,您不认为其他运行.NET的程序会对结果产生一些影响吗?我想知道它是否也与AppDoamins有关?我的意思是GC只在这个AppDomain中进行清理,而不在其他应用程序或其他应用程序中进行清理?@zenwalker:CLR不是在多个进程之间共享的,因此其他正在运行的.NET应用程序不会影响测量。@FloriangReacher同样的w.r.t GC是对的,而您要求它进行一些收集工作和其他应用程序正在创建一些随机内存(假设)在这种情况下?@zenwalker:对不起,我不明白你的问题。CLR(以及他们的地面军事系统)不同进程之间没有任何知识,因此彼此之间没有影响。哦,哇!在测量时间之前进行垃圾收集的方式非常聪明。非常酷!Jon,在调用Gc.Collect和Waitforpendingfinalizers()后,只是处于相反的情况或者,当CLR执行此方法并要求GC进行一些收集时,您不认为其他运行.NET的程序可能会对结果造成一些差异吗?我想知道这是否与AppDoAdmins也有关系?我的意思是GC只在这个AppDomain中进行清理,而不在其他或某些东西中进行清理?@zenwalker:CLR不在mul之间共享tiple进程,这样其他正在运行的.NET应用程序就不会影响测量。@FloriangReacher相同的w.r.t GC对吧,而你让它做一些收集工作,而其他应用程序在这种情况下会创建更多的随机内存(让我们假设一下)?@zenwalker:对不起,我不明白你的问题。CLR(以及它们的GC)对不同的过程没有任何了解,因此相互之间没有影响。
Initial size: 0; Ticks: 5589583
Initial size: 1; Ticks: 8137963
Initial size: 2; Ticks: 8399579