XName 对象的预原子化 (LINQ to XML)

提高 LINQ to XML 中的性能的一种方法是预原子化 XName 对象。 预原子化是指在通过使用 XElementXAttribute 类的构造函数创建 XML 树之前,先将字符串分配给 XName 对象。 然后传递初始化的 XName 对象,而不是将字符串传递给构造函数(此过程将使用从字符串到 XName 的隐式转换)。

当创建其中重复出现特定名称的大型 XML 树时,这样可以提高性能。 为此,请在构造 XML 树之前声明和初始化 XName 对象,然后使用 XName 对象,而不是指定元素和属性名称的字符串。 当创建大量具有相同名称的元素(或属性)时,此技术可以显著提高性能。

应针对您的方案测试预原子化以确定是否应使用它。

示例

下面的示例说明了这一点。

XName Root = "Root";
XName Data = "Data";
XName ID = "ID";

XElement root = new XElement(Root,
    new XElement(Data,
        new XAttribute(ID, "1"),
        "4,100,000"),
    new XElement(Data,
        new XAttribute(ID, "2"),
        "3,700,000"),
    new XElement(Data,
        new XAttribute(ID, "3"),
        "1,150,000")
);

Console.WriteLine(root);

此示例产生以下输出:

<Root>
  <Data ID="1">4,100,000</Data>
  <Data ID="2">3,700,000</Data>
  <Data ID="3">1,150,000</Data>
</Root>

下面的示例演示针对命名空间中的 XML 文档的相同技术:

XNamespace aw = "https://www.adventure-works.com";
XName Root = aw + "Root";
XName Data = aw + "Data";
XName ID = "ID";

XElement root = new XElement(Root,
    new XAttribute(XNamespace.Xmlns + "aw", aw),
    new XElement(Data,
        new XAttribute(ID, "1"),
        "4,100,000"),
    new XElement(Data,
        new XAttribute(ID, "2"),
        "3,700,000"),
    new XElement(Data,
        new XAttribute(ID, "3"),
        "1,150,000")
);

Console.WriteLine(root);

此示例产生以下输出:

<aw:Root xmlns:aw="https://www.adventure-works.com">
  <aw:Data ID="1">4,100,000</aw:Data>
  <aw:Data ID="2">3,700,000</aw:Data>
  <aw:Data ID="3">1,150,000</aw:Data>
</aw:Root>

下面的示例更类似于实际中可能遇到的情况。 在此示例中,元素的内容由查询提供:

XName Root = "Root";
XName Data = "Data";
XName ID = "ID";

DateTime t1 = DateTime.Now;
XElement root = new XElement(Root,
    from i in System.Linq.Enumerable.Range(1, 100000)
    select new XElement(Data,
        new XAttribute(ID, i),
        i * 5)
);
DateTime t2 = DateTime.Now;

Console.WriteLine("Time to construct:{0}", t2 - t1);

上一示例的执行性能优于下面的示例(其中未对名称进行预原子化):

DateTime t1 = DateTime.Now;
XElement root = new XElement("Root",
    from i in System.Linq.Enumerable.Range(1, 100000)
    select new XElement("Data",
        new XAttribute("ID", i),
        i * 5)
);
DateTime t2 = DateTime.Now;

Console.WriteLine("Time to construct:{0}", t2 - t1);

请参见

概念

性能 (LINQ to XML)

原子化 XName 和 XNamespace 对象 (LINQ to XML)