Compartir a través de


Atomización previa de objetos XName (LINQ to XML)

Actualización: November 2007

Una manera de mejorar el rendimiento en LINQ to XML es realizar una atomización previa de los objetos XName. La atomización previa significa que asigna una cadena a un objeto XName antes de crear el árbol XML utilizando los constructores de las clases XAttribute y XElement. A continuación, en lugar de pasar una cadena al constructor, que utilizaría la conversión implícita de cadena a XName, pasa el objeto XName inicializado.

Esto mejora el rendimiento si crear un árbol XML de gran tamaño en el que se repiten nombres específicos. Para ello, debe declarar e inicializar los objetos XName antes de construir el árbol XML y, a continuación, utilizar los objetos XName en lugar de especificar las cadenas para los nombres de atributo y elemento. Esta técnica puede producir un aumento significativo del rendimiento si va a crear un gran número de elementos (o atributos) con el mismo nombre.

Debería probar la atomización previa con su situación para decidir si debe utilizarla.

Ejemplo

En el siguiente ejemplo se muestra cómo hacerlo.

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);

Este ejemplo genera el siguiente resultado:

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

En el siguiente ejemplo se muestra la misma técnica donde el documento XML se encuentra en un espacio de nombres:

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);

Este ejemplo genera el siguiente resultado:

<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>

El ejemplo siguiente es más similar a lo que probablemente encontrará en el mundo real. En este ejemplo, una consulta proporciona el contenido del elemento:

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);

El ejemplo anterior se ejecuta mejor que el siguiente, en el que los nombres no se atomizan previamente:

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);

Vea también

Conceptos

Rendimiento (LINQ to XML)

Objetos XName y XNamespace atomizados (LINQ to XML)