En rutinas de procesamientos es común la utilización de refresh de componente o modificación de algún dato de interfaz para mejorar el feedback del procesamiento para el usuario.
La utilización constante de la interacción con componentes de pantalla durante un procesamiento es perjudicial para el desempeño del Microsiga Protheus, pues cada interacción ejecuta un intercambio de mensaje entre el servidor y el cliente. Cuando hay un exceso de concurrencia constante en el servidor, la interacción puede perjudicar drásticamente el desempeño. Verifique la siguiente prueba:
// UIUpdatePerformanceTest.prw
#INCLUDE "TOTVS.CH"
#DEFINE INTERACTIONS 100000
Function UIUpdatePerformanceTest()
Local oDlg := Nil
Local oSay := Nil
Local oMeter := Nil
Local nMeter := 0
Define Dialog oDlg Title "UI Update Performance Test" From 0,0 To 75,400 Pixel
@05,05 Say oSay Prompt "Texto" Of oDlg Pixel Colors CLR_RED,CLR_WHITE Size 185,20
@15,05 Meter oMeter Var nMeter Pixel Size 185,20 Of oDlg
Activate Dialog oDlg Centered On Init (IntenseUpdate(oDlg, oSay, oMeter),ControlledUpdate(oDlg, oSay, oMeter))
Return
Static Function IntenseUpdate(oDlg, oSay, oMeter)
Local nSeconds := 0
Local nCount := 0
oMeter:SetTotal(INTERACTIONS)
nSeconds := Seconds()
oSay:SetText("Interacción constante")
For nCount := 1 To INTERACTIONS
oMeter:Set(nCount)
oDlg:CommitControls()
Next
ConOut("Para " + AllTrim(Str(INTERACTIONS)) + " interacciones, se utilizó un tiempo de " + AllTrim(Str(Seconds()-nSeconds)) + " segundos.")
Return
Static Function ControlledUpdate(oDlg, oSay, oMeter)
Local nSeconds := 0
Local nCount := 0
Local nLastUpdate := 0
oMeter:SetTotal(INTERACTIONS)
nSeconds := Seconds()
oSay:SetText("Interacción controlada")
For nCount := 1 To INTERACTIONS
If (Seconds() - nLastUpdate) > 1 // Se pasó 1 segundo desde la última actualización de la pantalla
oMeter:Set(nCount)
oDlg:CommitControls() // Para actualizar la pantalla y que el usuario reciba el feedback
nLastUpdate := Seconds()
EndIf
Next
// Realiza una actualización final para garantizar que el usuario visualice el resultado del procesamiento
oMeter:Set(nCount)
oDlg:CommitControls() // Para actualizar la pantalla y que el usuario reciba el feedback
ConOut("Para " + AllTrim(Str(INTERACTIONS)) + " interacciones controladas, se utilizó un tiempo de " + AllTrim(Str(Seconds()-nSeconds)) + " segundos.")
Return
El resultado fue:
Para 100000 interacciones, se utilizó un tiempo de 0.938 segundos.
Para 100000 interacciones controladas, se utilizó un tiempo de 0.055 segundos.
En las interacciones no controladas se enviaron 100000 comandos de actualización de pantalla, ya en la función de interacción controlada el número enviado fue dramáticamente menor, pues la actualización solo ocurría una vez por segundo.
Esta situación puede aplicarse en cualquier interacción de actualización o modificación de componente de pantalla.