Nesse cenário temos que levar em conta um item muito importante, a preparação do ambiente.
No RPC sempre que necessitamos de um ambiente preparado para realizar um determinado procedimento temos que utilizar o método “SetEnv”, que vai realizar todo o trabalho de preparação de ambiente, e a partir disso podemos iniciar a implementação das rotinas, que de acordo com os testes que estão no exemplo terão um melhor desempenho, demorando menos tempo, mas levando em conta somente depois do método “SetEnv” ser chamado. Já o Web Service trabalha de forma totalmente diferente, o ambiente já fica instanciado no servidor, então quando executado, não há necessidade de realizar o “SetEnv”, porém o desempenho da rotina não é muito maior que o do RPC. Veja o exemplo com dados só contando com execução de rotina, sem levar em conta a preparação do ambiente, numa repetição de 1000 vezes.
Tempo usando RPC 9.936
Tempo usando Web Service 16.42
Teste:
// WebServiceVsRPCTeste.prw
#INCLUDE "TOTVS.CH"
#INCLUDE "APWEBSRV.CH"
#INCLUDE "TBICONN.CH"
Static nVezes := 1000 // Numero de Repeticoes
Function WebServiceVsRPCTeste()
// Testa Web Service
TestWs()
// Intervalo de tempo
Sleep(500)
// Testa RPC
TestRpc()
Return
Static Function TestWs()
Local oWS := Nil // Instacia classe de Web Service
Local nX := 1 // Contador de Repeticoes
Local cTet := "" // Retorno de teste
Local nSeconds := Seconds() // Armazena segundos inicial
// Instacia classe de Web Service
oWS := WSWSTESTPER():New()
// Informa o Ip que esta o Web Service
oWs:_URL := "http://172.16.31.118:89/WSTESTPER.apw"
// Realiza repeticoes de Chamada de Web Service
For nX := 1 To nVezes
oWs:CCCODCLI := "000001"
oWs:nnVezes := nX
oWS:PEGANOMECLI()
cTet := oWs:CPEGANOMECLIRESULT
Next nX
ConOut("Tempo execução Web Service " + AllTrim(Str(Seconds() - nSeconds) ))
Return
Static Function TestRpc()
Local oServer := Nil // Objeto que chama Classe de RPC
Local lConect := .T. // Reotrno de RPC fez comunicação
Local cRet := "" // Retorno
Local nX := 0 // Contador de repeticao
Local nSeconds := 0 // Armazena segundos inicial
// Ip e porta do Server que o RPC se conectara
oServer :=FwRpc():New( "172.16.31.118", 5041 , "MULTINEG" ) // Instancia o objeto de oServer
oServer:SetRetryConnect(1)
lConect := oServer:Connect() // Tenta efetuar conexao
// Prepara Ambiente
oServer:SetEnv("T1", "D MG 01", "LOJA") // Prepara o ambiente no servidor alvo
// Intervalo de Tempo para iniciar rotina
Sleep(5000)
// Inicia repeticoes
nSeconds := Seconds() // Armazena segundos inicial
For nX := 1 To nVezes
cRet := oServer:CallProc("TetSeeCli", "000001", nX)
Next nX
// Desconecta do servidor
oServer:Disconnect()
ConOut("Tempo execução RPC " + AllTrim(Str(Seconds() - nSeconds) ))
Return cRet
WSService WSTestPer Description "Servico de Test de Performece"
WSData cCodCli As String
WSData cNomeClie As String
WSData nVezes As Integer
WSMethod PegaNomeCli Description "Pega nome do 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