C#DataTable vs一些通用集合性能

时间:2013-06-07 17:34:19

标签: c# generics datatable boxing unboxing

我知道当我们插入/获取数据时DataTable正在使用装箱/取消装箱。例如,如果我们有大量数据仅包含int,那么使用某种通用DataTable是不是更快,让我们说MyDataTable<int>,这将导致避免装箱/拆箱开销?

2 个答案:

答案 0 :(得分:3)

字符串是引用类型,因此没有拳击开销:它们永远不会被装箱。 DataTable确实有很多开销 - 这是能够代表任意列模型以及约束,变更跟踪等的成本。为了获得最佳性能,POCO模型很难被击败。例如:

public class Customer {
    public int Id { get; set; }
    public string Name { get; set; }
    // ...
}

有很多ORM和微型ORM可以使用这种模型。

但请注意,在DataTable中,值存储在正确类型的数组中。 Ints存储在int []中 - 这是通过将数据存储在列而不是行中来实现的。拳击仅在将数据输入/输出DataTable时发生。

答案 1 :(得分:2)

您需要处理的主要问题是DataTable可以包含任意数量的列,其中每列可以是任何类型。您不能对它进行泛化,同时每列仍有不同的类型。

避免装箱的一种方法是,而不是使用DataTable,创建一个对象来表示每一行。确保对象具有适当类型的每个列的属性。然后,您可以使用这些对象的List(或其他一些数据结构)。

如果您的数据具有完全int值,则另一个选项是创建一个多维的整数数组(int[,] mydata = new int[10000,5];)。这也可以避免装箱整数。