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
- CodeGear, please release the TClientDataSet (midas.dll) code!
- What a bad ReallocMem can do to Midas
- Midas Speed Fix – Unit e Download

12 Comments
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.
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.
Cesar,
Voce poderia passar um passo a passo de como instalar esta unit no projeto.
Valeu.
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.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.
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/
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.
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!!!
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”
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.
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.
Como faço para usar a variavel
ReportMemoryLeaksOnShutdown:= True; no delphi 7 ], coloque ela no meu projeto e deu erro.