segunda-feira, janeiro 26, 2009

Performace: DataSet x XPath

Aqui no trabalho me mandarão otimizar a forma como o XML é manipulado (Muitos arquivos, muitos mesmo), aém de diminuir o número de chamadas para esses arquivos também me surgiu de otimizar a gravação que era feita com DataSet fiz um Benchmark da alteração de um único registro usando DataSet x XPath, o ganho com XPath foi de 900ms (bem interessante não?)

só desculpa pela formatação do código eu o template do blogger e o FireFox não entramos em um acordo. logo vou corrigir.

   1:  //usando DataSet
   2:  public static bool alterarCampo(string path, int id, Parametro parametro)
   3:          {
   4:              bool resultado = false;
   5:              DataSet dataSet = new DataSet();
   6:  
   7:              try
   8:              {
   9:                  dataSet.ReadXml(path);
  10:  
  11:                  dataSet.Tables[0].DefaultView.RowFilter = "ID = " + id.ToString();
  12:                  dataSet.Tables[0].DefaultView[0][parametro.Campo] = parametro.Valor;
  13:                  dataSet.Tables[0].WriteXml(path);
  14:  
  15:                  resultado = true;
  16:              }
  17:              catch (Exception)
  18:              {
  19:  
  20:                  resultado = false;
  21:              }
  22:              
  23:  
  24:              dataSet = null;
  25:              return resultado;
  26:          }
  27:  
  28:  //Usando XPath
  29:  public static bool alterarCampo(string path, int id, Parametro parametro)
  30:          {
  31:              bool resultado = false;
  32:              try
  33:              {
  34:                  StreamReader stream = new StreamReader(File.Open(path, FileMode.Open));
  35:                  XmlDocument doc = new XmlDocument();
  36:  
  37:                  string xPathStr = String.Format("/CATALOGO/LIVRO[ID = '{0}']", iclipping);
  38:                  doc.LoadXml(stream.ReadToEnd());
  39:                  stream.Close();
  40:                  stream = null;
  41:  
  42:                  XPathNavigator navigator = doc.CreateNavigator().SelectSingleNode(xPathStr);
  43:                  XPathNavigator nCampo = navigator.SelectSingleNode(parametro.Campo);
  44:  
  45:                  //O elemento nao existe
  46:                  if (nCampo == null)
  47:                  {
  48:                      navigator.AppendChild(String.Format("<{0}>{1}</{0}>", parametro.Campo, parametro.Valor));
  49:                  }
  50:                  else //logo existe
  51:                  {
  52:                      nCampo.SetValue(parametro.Valor);
  53:                  }
  54:  
  55:                  FileStream fstream = File.Open(path, FileMode.Open);
  56:                  doc.Save(fstream);
  57:                  fstream.Close();
  58:                  resultado = true;
  59:              }
  60:              catch (Exception)
  61:              {
  62:                  resultado = false;
  63:  
  64:              }
  65:  
  66:              return resultado;
  67:          }
Quanto aos resultados foi esse p número que consegui (Visual Studio Test)


ModificarXML alterarCampo(string path, int iclipping, Parametro parametro) BOX71 22/01/09 11:26 22/01/09 11:26 00:00:00.3165278 Xpath

ModificarXML alterarCampo(string path, int iclipping, Parametro parametro) BOX71 22/01/09 11:50 22/01/09 11:50 00:00:01.2892166 DataSet


Maquina : Intel 2140 2x1.6GHz 2GB Ram

Sem comentários: