Histórico da Página
Las formas utilizadas para ejecutar un código ADVPL por macroejecución son "Eval" y "&", sin embargo, las dos tienen desempeños diferentes. Realizamos una prueba comparando los dos desempeños en una repetición de 100.000 veces.
Tiempo de llamada de función utilizando "Eval": 0.703 Tiempo de llamada de función utilizando "&": 0.531 Prueba: // EvalVsETeste.prw
#INCLUDE "TOTVS.CH"
Static nVezes := 100000 // Repeticiones de pruebas
Function EvalVsETeste()
// Prueba con "&"
TesEcom()
// Prueba con Eval()
TesEval()
Return
Static Function TesEcom()
Local cBloco := "" // Bloque de códigos
Local nX := 0 // Contador de repeticiones
Local nSeconds := 0 // Segundos en que se inició la rutina
Local cRet := "0" // Retorno del bloque de código
nSeconds := Seconds()
For nX := 1 To nVezes
cBloco := "FunTesExec(53, 10)"
cRet := &(cBloco)
Next nX
ConOut("Tiempo de llamada de función utilizando 'Macroejecución': " + AllTrim(Str(Seconds() - nSeconds)) )
Return
Static Function TesEval()
Local nX := 0 // Contador de repeticiones
Local nSeconds := 0 // Segundos en que se iniciaron las operaciones
Local cRet := "" // Retorno del bloque de código
nSeconds := Seconds()
For nX := 1 To nVezes
bBloco := {|N| x := FunTesExec(53, 10)}
cRet := Eval(bBloco)
Next nX
ConOut("Tiempo de llamada de función utilizando 'EVAL': " + AllTrim(Str(Seconds() - nSeconds)))
Return
Function FunTesExec(nExpr, nTam)
Local cNum := "" // Retorno de la función de prueba
Default nExpr := 1
Default nTam := 1
// Prueba de Str para la generación del procesamiento
cNum := StrZero(nExpr,nTam)
Return cNum