As formas usadas para executar um código ADVPL por macro execução são “Eval” e “&”, porém essas duas tem desempenhos diferentes.
Realizamos um teste comparando os dois desempenhos numa repetição de 100.000 vezes.
Tempo chamada de função usando “Eval”: 0.703
Tempo chamada de função usando “&”: 0.531
Teste:
// EvalVsETeste.prw
#INCLUDE "TOTVS.CH"
Static nVezes := 100000 // Repetições de testes
Function EvalVsETeste()
// Teste com "&"
TesEcom()
// Teste com Eval()
TesEval()
Return
Static Function TesEcom()
Local cBloco := "" // Bloco de códigos
Local nX := 0 // Contador de repetições
Local nSeconds := 0 // Segundos que iniciou a rotina
Local cRet := "0" // Retorno do Bloco de Codigo
nSeconds := Seconds()
For nX := 1 To nVezes
cBloco := "FunTesExec(53, 10)"
cRet := &(cBloco)
Next nX
ConOut("Tempo chamada de função usando 'Macro Execução': " + AllTrim(Str(Seconds() - nSeconds)) )
Return
Static Function TesEval()
Local nX := 0 // Contador de Repetições
Local nSeconds := 0 // Segundos que iniciou as Operacoes
Local cRet := "" // Retorno do Bloco de Codigo
nSeconds := Seconds()
For nX := 1 To nVezes
bBloco := {|N| x := FunTesExec(53, 10)}
cRet := Eval(bBloco)
Next nX
ConOut("Tempo chamada de função usando 'EVAL': " + AllTrim(Str(Seconds() - nSeconds)))
Return
Function FunTesExec(nExpr, nTam)
Local cNum := "" // Retorno da funcao de teste
Default nExpr := 1
Default nTam := 1
// Teste de Str para gerar processamento
cNum := StrZero(nExpr,nTam)
Return cNum