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 2×1.6GHz 2GB Ram

Posted in Uncategorized Tagged with:

Notebook e Infertilidade

pesquisando sobre suporte para notebook pra poder trabalhar com ele no colo o calor me encomodava tanto

descobri o seguinte

Fatores de Estilo de Vida: Remédios como a Sulfasalazina, a Cimetidina, a Nitrofurantoina; o Chumbo (presente em alguns remédios neurológicos); o Arsênico; e drogas ilícitas como a Maconha, os Esteróides Anabolizantes, e a Cocaína podem interferir com a capacidade de produzir espermatozóides (espermatogênese). Medicamentos anti-hipertensivos (como alguns diuréticos) podem prejudicar a ejaculação. O cigarro tem um efeito moderado, porém negativo na espermatogênese e pode contribuir para a infertilidade. A exposição excessiva ao calor como o de banheiras quentes ou saunas pode diminuir a produção do esperma.

A zona térmica do meu notebook fica em média a 55º Graus Celcius, numca mais vou usar ele no colo (até conseguir um suporte)

Posted in Uncategorized Tagged with:

Máscaras JQuery

Bom estou fazendo uns freela em ASP.NET/C#, e me surgiu algumas gracinhas em AJAX vou postar aqui, o primeiro post é relacionado a mascáras tinha procurado por algum tempo em fracasso éssa semana achei sem querer, hoje testei. você vai prescisar da JQUery, e um plug-in para máscara [data jquery] é bem simples usar o download do código pode ser feito [aqui]
o maldito blogspot acabou co com a visualização

   1:  <?xml version="1.0" encoding="UTF-8"?>
   2:  <!DOCTYPE html 
   3:       PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   4:      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
   5:  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   6:      
   7:    <head>
   8:      <title>JQuery</title>
   9:      <script type="text/javascript" src="jquery-min.js"></script>
  10:    </head>
  11:    <body>
  12:  <form id="formCadastro" >
  13:      <table >
  14:      
  15:      <TD>
  16:      Data
  17:      </TD>
  18:      <TD>
  19:      <input type="text" id="txtData" />
  20:      </TD>
  21:      </TR>
  22:      <tr>
  23:      <TD>
  24:      Custom
  25:      </TD>
  26:      <TD>
  27:       <input type="text" id="txtPlaca" />
  28:      </TD>
  29:      </tr>
  30:      </table>
  31:      
  32:      </form>
  33:      <script src="jquery.maskedinput.js" type="text/javascript"></script>
  34:      <script type="text/javascript">
  35:         jQuery(function($) {
  36:        
  37:            $('#txtData').mask('99/99/9999');
  38:      $('#txtPlaca').mask('aaa-9999');
  39:       
  40:     });</script>    
  41:      </script>
  42:        
  43:    </body>
  44:  </html>
Posted in Uncategorized Tagged with: ,

Gerenciamento de memória GC

Introdução (que deve ser lida depois).

http://www.hpl.hp.com/personal/Hans_Boehm/gc/
http://www.hpl.hp.com/personal/Hans_Boehm/gc/04tutorial.pdf

Quem monitora a lista comp.lang.c++ deve ter visto o tópico sobre o
garbage Collector

[http://groups.google.com/group/comp.lang.c++/browse_thread/thread/8100fa1e738da5a4?hl=en]

lendo o pdf descobri isto (slide 64)

Bora lá.

************************************************************

Other experiences • Generally works quite well for small (
clients or on 64-bit machines. • Sometimes needs a bit pointer location information for frequently occurring heap objects. Usually GC_MALLOC_ATOMIC is sufficient for C code. • Some successful uses with much larger heaps. • Some problems with 500MB heaps on 32-bit machines. • Large arrays (> about 1MB) sometimes problematic. • Fragmentation cost (for heaps > a few MB) is typically less than a factor of 2. • Fragmentation essentially never an issue for small objects. • Whole block coalescing is important. • I haven’t seen much of a problem with long running apps. (Vesta, Xerox printers). • Stationary objects allow one word object headers in gcj.

***************************************************
tem também os becnhmarks

Becnhmark

C expl. free é o malloc que nós costumamos usar BDW GC é o Garbage Collection.

pra completar vai as dicas que recebi no grupo cppbrasil [google groups]

***************************************************************

Arrays grandes não costumam ser um problema pro Boehm GC desde que
você não fique alocando/desalocando eles com freqüência. Eles causam o mesmo
problema de fragmentação que com malloc.

Quanto a performance. Bom, para ter uma performance razoavel é necessário usar alocação
tipada e, principalmente, trabalhar sem interior pointers. Se for possível ter essas duas restrições
no teu projeto, o BoehmGC com o coletor incremental ou paralelo é aceitavel.

Porém GC em uma linguagem como C++, que não tem um sistema de tipos forte e a pilha não é tipada
é bem complicado mesmo. Não tem milagre. Vai ser mais lento e vai usar mais memória.

Porém a não ser que você esteja trabalhando com programas extremamente sensíveis a performance,
o GC vai ser o menor dos teus problemas. Normalmente não irá ocupar mais que 10% do total de cpu
usado.

Quanto ao problema de fragmentação, ele existe e é real com heaps grandes em sistemas 32 bits. Não espere
conseguir usar heaps de 1.5 – 2 Gb num sistema 32bits.

*****************************************************************

Conclusão
deixa de ser preguiçoso use o GC só como detector de memory leak ele faz muito bem isso
e a Mozilla usa ele para isso, um makefile com a opção –with-debug resolveria isso. Creio que tb deva fazer um comparativo malloc vs new para arrays e objetos.

espero que as informações tenhão sido uteis
ps: 10% da cpu é um preço muito caro, quando eu mexer no Makefile faço alguns benchmarks devia aprender a usar a Boost pra isso també né.

Posted in Uncategorized Tagged with:

Newbie Engine Updates

Bom Re-apareci com novas, agora é oficial aquela bagunça de testes e blá blá acabarão, organizei o código da engine como qualquer outro projeto GNU
(diretórios src,include), criei o autogen/automake, tem código novo (ParticleSystem, Material, Matrix)(Command ainda nao implementada p/ o console, [q eu nao commitei ainda]) algumas correções, mas que seja com isto temos a versão 0.0.1 (The Begin), creio que nos próximos meses só vou mexer com a parte gráfica os próximos passos são adicionar luzes, e texturas, presciso pensar sobre o terreno qual técnica usar p/ ambiente aberto (comenta uma dica), tb estou pensando eu criar HeightMaps, enfim se eu colocar todas a idéias aqui vai dar um livro melhor trabalhar né, só pra teriminar tenho que criar todos os objetos básicos na unha (Sphere,Cube,Torus,Piramide,Cone,Cilynder,Capsule,etc..) na unha quero q acesso total ao veriticel isso vai permitir modificações do Objeto em Run-Time.
até mais passa la no svn e da um check-out.

http://newbie-engine.svn.sourceforge.net/viewvc/newbie-engine/

Posted in Uncategorized Tagged with:

Newbie Game Engine Updates

Bom dia pessoal, boas novas depois que eu adiquiri um note, o desenvolvimento está mais ativo, agora está do sendo todo gerenciado pelo sourceforge.net, o código está no SVN compensa dar uma olhada em /expirements/GL_ARB lá estou prosseguindo com os estudos sobre o Architech Review Board do openGL, estou implementando o uso de vertex buffers, e próximo passo será GL_ARB_vertex_program e GL_ARB_fragment_program

http://newbie-engine.svn.sourceforge.net/viewvc/newbie-engine/

Posted in Uncategorized Tagged with:

Cel Shading em Delphi

Implementei um algoritimo basico de Cel Shading Basico em Delphi, baseado na lição 37 da NeHe (OpenGL), agora que, sei como funciona (que é o principal) vou passar pra engine em C++ mas como as coisas aqui estão andando em ritimo de tartagura não será tão breve, aguardem Até mais pessoal.

quer uma copia GPL
http://br.geocities.com/newbie_x11/Testing.zip
Posted in Uncategorized Tagged with:

newbie-engine news

-O Parse de XML (Agradeço ao time BZK) já esta funcionando

-Carregando Mesh (Wavefronr .obj) no formato trigonometrico, falta aplicar, materiais e texturas

-Projeto adicionado ao sourceforge.

-Agradecimento ao Jaca, (modelador) vlw.!!!
http://sourceforge.net/projects/newbie-engine/
http://br.geocities.com/newbie_x11/newbie_engine.zip (Não consegui fazer upload no SF)

Posted in Uncategorized Tagged with:

Rotação um dia fica bom :-)

olha só o que era pra ser uma rotação em torno do eixo Z, mas hj vou fazer uma enorme bateria de teste pra ver o q dá, em quanto isso tai o código c vc puder me ajudar
#include
#include “math.h”
#include “SDL.h”
#include “SDL_gfxPrimitives.h”
#define deg2rad M_PI/180.0
#define HALFX 320
#define HALFY 240
#define RESX 640
#define RESY 480
class Vertex
{
public:
float x;
float y;
float z;
const Vertex& operator= (Vertex& V)
{
x = V.x;
y = V.y;
z = V.z;
return *this;
};
};
Vertex V1,V2;
/* translacao */
void VecTranslate(Vertex *V,float tx,float ty,float tz)
{
V->x += tx;
V->y += ty;
V->z += tz;
}
/* escala */
void VecScale(Vertex *V,float sx,float sy,float sz)
{
V->x *= sx;
V->y *= sy;
V->z *= sz;
}
/* rotacao em eixo arbitrario */
void VecRotate(Vertex *V,float x,float y,float z,float theta)
{
float xx,yy,zz,xy,xz,yz,xSintheta,ySintheta,zSintheta,Costheta,Sintheta,UmMenosCostheta;
Costheta = cosf(theta);
Sintheta = sinf(theta);
UmMenosCostheta = 1-Costheta;
xx = x*x*UmMenosCostheta;
yy = y*y*UmMenosCostheta;
zz = z*z*UmMenosCostheta;
xy = z*y*UmMenosCostheta;
xz = x*z*UmMenosCostheta;
yz = y*z*UmMenosCostheta;
xSintheta = x*Sintheta;
ySintheta = y*Sintheta;
zSintheta = z*Sintheta;
V->x = (xx+Costheta) * V->x + (xy – zSintheta) * V->y + (xz + ySintheta) * V->z;
V->y = (xy+zSintheta) * V->x + (yy + Costheta) * V->y + (yz – xSintheta) * V->z;
V->z = (xz-ySintheta) * V->x + (yz + xSintheta) * V->y + (zz + Costheta) * V->z;
}
/* Projecao */
void VecProject(Vertex *V,float distance)
{
float x,y;
x = V->x / V->z;
y = V->y / V->z;
V->x = HALFX +(RESX*x);
V->y = HALFY +(RESY*y);
}
int main()
{
Vertex V1,V2,Va,Vb;
SDL_Surface *screen;
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(RESX,RESY,8,SDL_SWSURFACE);
if (screen == NULL)
{
printf(“Nao foi possivel iniciar o videon”);
exit(0);
}
V1.x = 5;
V1.y = 5;
V1.z = 10;
V2.x = 15;
V2.y = 5;
V2.z = 10;
VecTranslate(&V1,0,0,50);
VecTranslate(&V2,0,0,50);
VecScale(&V1,1.5,1.5,1.5);
VecScale(&V2,1.5,1.5,1.5);
float rx =1*deg2rad;
while (1)
{
if (rx >= 360*deg2rad)
rx = 1*deg2rad;
Va = V1;
Vb = V2;
VecRotate(&Va,0,0,1,rx);
VecRotate(&Vb,0,0,1,rx);
VecProject(&Va,100);
VecProject(&Vb,100);
lineColor(screen,Va.x,Va.y,Vb.x,Vb.y,0xFFFFFFFF);
SDL_UpdateRect(screen,0,0,RESX,RESY);
rx+=(1*deg2rad);
}
return 0;
}
Posted in Uncategorized