列出<t> vs数组,哪一个更快?</t>

时间:2014-03-07 10:57:57

标签: c# arrays performance list

我有一个应用程序,在启动时加载10 List<myClass>。 我的工作加载有点慢,我在考虑使用数组而不是List<T>

我的代码:

    List<MyClass> objects = MyClass.Get();
    foreach (MyClass c in objects)
    {
        comboBox.Items.Add(c.Text);
    }


    class MyClass
    {

        //some properties

        public MyClass(string key)
        {
             //Database is another class for executing sql queries.
             //GetString(int columnIndex, int rowIndex)
             using (DataBase db = new DataBase())
             {
                 db.Query = "SELECT ID FROM sampleTable WHERE ID= @param";
                 db.Parameters.Add("param", SqlDbType.NVarChar, 100, key);
                 Name = db.GetString(0, 0);
             }
        }

        public static List<MyClass> Get()
        {
             using (Database db = new Database())
             {
                 db.Query = "SELECT ID FROM sampleTable ORDER BY sampleTextField";
                 int c = db.GetRowCount();
                 List<MyClass> result = new List<MyClass>();
                 for (int i = 0; i < c; i++)
                 {
                     result.Add(new MyClass(db.GetString(0, i)));
                 }
                 return result;
             }
         }
    }

使用数组是个好主意吗?

请随时向我提出加速此代码的任何想法。

5 个答案:

答案 0 :(得分:2)

您必须使用类似Stopwatch的内容来确定时间。

但是,我猜它几乎没有什么区别,因为时间会被数据库访问的开销完全淹没。

因此,您应该专注于加速数据库访问,而不是担心使用数组或列表。但在你做任何其他事情之前,请检查你的程序(使用Stopwatch),以便你知道时间的去向。

答案 1 :(得分:0)

用数组测试它,并计时!我最近做了类似的事情,发现通常数​​组的速度要快一些,但列表编码通常更容易。 C#擅长列表,不像C ++,我曾经发现数组比矢量有更大的好处。

答案 2 :(得分:0)

由于您知道列表的最终大小,因此您可以通过在构建时设置列表容量来加快速度。

List<MyClass> result = new List<MyClass>(c);

这样做可以避免重新分配底层数组。否则,我认为你没有任何更重要的开销。

答案 3 :(得分:0)

我怀疑使用List是一个瓶颈。使用数组,您需要提前知道大小,以便正确地对数组进行尺寸标注:

             MyClass[] result = new MyClass[c];
             for (int i = 0; i < c; i++)
             {
                 result[i] = new MyClass(db.GetString(0, i));
             }

但是如果您事先了解了大小,就可以以相同的方式将列表初始化为所需的容量,从而避免重新分配并提供几乎相同的性能:

             List<MyClass> result = new List<MyClass>(c);
             for (int i = 0; i < c; i++)
             {
                 result.Add(new MyClass(db.GetString(0, i)));
             }

但是我要重申,这不太可能产生太大的影响。

答案 4 :(得分:0)

List internaly使用数组,但如果使用得当,开销很低。

在您的代码中,您可以预先分配所需的容量:

             int c = db.GetRowCount();
             List<MyClass> result = new List<MyClass>(c); //capacity
             for (int i = 0; i < c; i++)
             {
                 result.Add(new MyClass(db.GetString(0, i)));
             }

无论如何,您必须对您的代码进行分析,以确保花费时间。