En este escenario de desempeño tenemos que tomar en cuenta un punto muy importante, que es la preparación del Entorno.
En el RPC siempre que necesitamos de un Entorno preparado para realizar un determinado procedimiento tenemos que utilizar un método llamado "SetEnv", que realizará todo el trabajo de preparación de entorno, y a partir de este, puede iniciarse la implementación de las rutinas, que de acuerdo con las pruebas que están en el ejemplo, tendrá un mejor desempeño, demorando menos tiempo. Pero, esto ocurrirá únicamente después de llamar al método "SetEnv". Ya el Web Service trabaja de forma totalmente diferente, el entorno queda instanciado en el servidor, entonces, cuando se ejecuta, no hay necesidad de realizar "SetEnv", sin embargo, el desempeño de rutina a rutina no es mejor que el del RPC. Vea el ejemplo con datos, solo contando con la ejecución de la rutina, sin tomar en cuenta la preparación del entorno, en una repetición de 1000 veces.
Tiempo utilizado con RPC 9.936.
Tiempo utilizado conWeb Service 16.42.
Prueba:
// WebServiceVsRPCTeste.prw
#INCLUDE "TOTVS.CH"
#INCLUDE "APWEBSRV.CH"
#INCLUDE "TBICONN.CH"
Static nVezes := 1000 // Número de repeticiones
Function WebServiceVsRPCTeste()
// Prueba Web Service
TestWs()
// Intervalo de tiempo
Sleep(500)
// Prueba RPC
TestRpc()
Return
Static Function TestWs()
Local oWS := Nil // Instancia clase de Web Service
Local nX := 1 // Contador de repeticiones
Local cTet := "" // Retorno de prueba
Local nSeconds := Seconds() // Almacena segundos inicial
// Instancia clase de Web Service
oWS := WSWSTESTPER():New()
// Informa el IP que está en el Web Service
oWs:_URL := "http://172.16.31.118:89/WSTESTPER.apw"
// Realiza repeticiones de la llamada de Web Service
For nX := 1 To nVezes
oWs:CCCODCLI := "000001"
oWs:nnVezes := nX
oWS:PEGANOMECLI()
cTet := oWs:CPEGANOMECLIRESULT
Next nX
ConOut("Tiempo de ejecución del Web Service " + AllTrim(Str(Seconds() - nSeconds) ))
Return
Static Function TestRpc()
Local oServer := Nil // Objeto que llama una clase de RPC
Local lConect := .T. // Retorno de RPC estableció comunicación
Local cRet := "" // Retorno
Local nX := 0 // Contador de repetición
Local nSeconds := 0 // Almacena segundos inicial
// IP y puerto del Server al que se conectará el RPC
oServer :=FwRpc():New( "172.16.31.118", 5041 , "MULTINEG" ) // Instancia el objeto de oServer
oServer:SetRetryConnect(1)
lConect := oServer:Connect() // Intenta realizar la conexión
// Prepara entorno
oServer:SetEnv("T1", "D MG 01", "LOJA") // Prepara el entorno en el servidor objetivo
// Intervalo de tiempo para iniciar la rutina
Sleep(5000)
// Inicia repeticiones
nSeconds := Seconds() // Almacena segundos inicial
For nX := 1 To nVezes
cRet := oServer:CallProc("TetSeeCli", "000001", nX)
Next nX
// Desconecta del servidor
oServer:Disconnect()
ConOut("Tiempo de ejecución RPC " + AllTrim(Str(Seconds() - nSeconds) ))
Return cRet
WSService WSTestPer Description "Servicio de prueba de desempeño"
WSData cCodCli As String
WSData cNomeClie As String
WSData nVezes As Integer
WSMethod PegaNomeCli Description "Copia nombre del cliente"
EndWSService
WSMethod PegaNomeCli WSReceive cCodCli, nVezes WSSend cNomeClie WSService WSTestPer
Self:cNomeClie := TetSeeCli(Self:cCodCli, Self:nVezes)
Return .T.
Function TetSeeCli(cCodCli, nVezes)
Local cRet := ""
Default cCodCli := ""
Default nVezes := 1
DbSelectArea("SA1")
DbSetOrder(1)
If DbSeek(XFilial("SA1") + cCodCli)
cRet := SA1->A1_NOME
Conout(Str(nVezes))
EndIf
Return cRet