Acelerando TClientDataSet com Midas Speed Fix – Unit
A partir do post CodeGear, please release the TClientDataSet (midas.dll) code! no Fórum ???delphi.non-technical???, Andreas Hausladen analisou o problema de performance do TClientDataSet, no qual ele comenta no post What a bad ReallocMem can do to Midas, que ele explica que analisando a partir do assembler do MidasLib.dcu, descobriu que a realocação de memória não era feita de forma eficiente, então ele criou a unit Midas Speed Fix, que faz um patch em memória, redirecionando a realocação de memória para os métodos do FastMM.
Para se ter idéia, este é o teste que ele fez e publicou, programa teste em anexo ao QC 7102
[renomeie Vessels200.xml para Vessels.xml nos fonte e coloque um loop "for 1 to 10 do" antes de lientDataSet1.AppendData"]
Unit MidasLib do Delphi 2009:
1. Chamada: 858ms
2. Chamada: 1966ms
3. Chamada: 3182ms
4. Chamada: 4414ms
5. Chamada: 5678ms
Unit MidasLib do Delphi 2009 mais a unit MidasSpeedFix.pas:
1. Chamada: 406ms
2. Chamada: 265ms
3. Chamada: 374ms
4. Chamada: 312ms
5. Chamada: 281ms
Com estes números, não preciso comentar mais nada, então se você utiliza TClientDataSet, deve baixar esta unit e adicionar aos seus projetos.
MidasSpeedFix.pas, suporta desde o Delphi 6 até o 2009. E no mesmo post que tudo isto começou, Nick Hodges comentou que a correção já foi adicionada aos fontes e que estará na próxima atualização do Delphi 2009.
Referências

janeiro 21st, 2009 at 22:45
Quanto aos valores realmente não sem tem ao que comentar. Mas uma dúvida, como essa unit trabalha em cima da memória (não sei como faz exatamente), não se tem o risco de algum anti-virus/anti-spy implicar com o exe?
-> Não fiz testes com ela + anti-virus ainda.
janeiro 21st, 2009 at 22:55
Murilo,
Não tem perigo de ter problemas com anti-virus.
Patch em memória é algo comum na VCL, porque o código é feito dentro do contexto da aplicação seja através da MidasLib ou da Midas.dll. Diferente de escrever um programa que vai alterar outro.
Note que no caso da MidasLib, tudo vai ser parte do mesmo programa, e na Midas.dll, o executável que carregou a Midas.dll é quem vai fazer o patch.
janeiro 22nd, 2009 at 13:20
Cesar,
Voce poderia passar um passo a passo de como instalar esta unit no projeto.
Valeu.
janeiro 22nd, 2009 at 14:30
Otoni,
Só adicione ao projeto, um exemplo de um .dpr a seguir:
program Program1; uses FastMM4, Forms, MidasLib, MidasSpeedFix in '..\..\..\..\Components\Utils\MidasSpeedFix.pas', ThemedDBGrid in '..\..\..\..\Components\Utils\ThemedDBGrid.pas, FMainForm in 'FMainForm.pas' {MainForm}; begin Application.Initialize; ReportMemoryLeaksOnShutdown:= True; Application.CreateForm(TMainForm, MainForm); Application.Run; end.janeiro 22nd, 2009 at 15:01
Obrigado, Cesar, pela dica
estou tendo agora este erro ” [Fatal Error] PRTeste.dpr(160): File not found: ‘FastMM4.dcu’ ”
como faço para acertar isto.
Valeu.
janeiro 22nd, 2009 at 15:09
Otoni, se você utiliza O delphi 2006, 2007 ou 2009, basta apenas remover esta linha, pois estas versões já utilizam o FastMM como gerenciador de memória padrão. Se você usa usa uma versão anterior do Delphi, precisa baixar o FastMM e adicionar o diretório dele no Library Path do Delphi.
http://sourceforge.net/projects/fastmm/
janeiro 22nd, 2009 at 18:38
Caro Cesar, mais uma vez agradeço sua ajuda, consegui resolver o problema. Porém agora depois de instalado o FASTMM, descobri que meu programa está com “Vazamento de Memoria”. Como detectar este vazamento, trabalho com o DELPHI 7, e não tenho ideia de como resolver isto. Se Vc puder me ajudar, agradeço antecipadamente.
Mauro.
janeiro 22nd, 2009 at 18:55
Mauro,
Memory leak é causado por objetos que você criou e não destruiu, é necessário procurar nos fontes isto e corrigir.
Ex:
procedure ListarItemsMemoryLeak; var SL: TStringList; I: Integer; begin SL:= TStringList.Create; for I:= 0 to 99 do SL.Add('Item: ' + I); MessageDlg(SL.Text, mtInformation, [mbOK], 0); end;Este é um caso típico de memory leak, pois foi criado uma instancia de TStringList e não foi destruído, pra resolver este problema, é necessário o seguinte código:
procedure ListarItemsOK; var SL: TStringList; I: Integer; begin SL:= TStringList.Create; try for I:= 0 to 99 do SL.Add('Item: ' + I); MessageDlg(SL.Text, mtInformation, [mbOK], 0); finally SL.Free; end; end;Agora é procurar por Componentes, Forms e Objetos que você cria via código na aplicação e esqueceu de destruir.
Boa sorte!!!
janeiro 26th, 2009 at 07:06
estou testando aqui como vc falou so que aparece um mensagem toda vez que compilo o projeto teria como retirar este mensagem ou eu devo ter feito algo de errodo
“You must install an alternative memory manager like FastMM4. FastMM4 must run in RELEASE mode to see an improved performance”
janeiro 26th, 2009 at 07:41
Paulo, veja nos comentários anteriores, eu expliquei o mesmo para o Mauro. Para usar o MidasSpeedFix, é necessário utilizar o FastMM, tem o link nos outros comentários.
A partir do Delphi 2006, o FastMM já está incluido.
janeiro 30th, 2009 at 09:50
Cesar, executei os testes aqui com o programa exemplo anexado ao QC 7102. Realmente os tempos são impressionantes. Mas este caso específico, o TClientDataSet utiliza o método AppendData, buscando os dados de outro TClientDataSet. Porém, fizemos testes com as nossas aplicações fazendo importação de uma grande quantidade de dados buscando diretamente de arquivo texto e inserindo através dos métodos Insert e Post. Mesmo assim estamos buscando uma forma de poder aproveitar as vantagens do Midas Speed Fix.
Grande abraço.