Muitas vezes, simples alterações no código podem fazer com que a velocidade de seu sistema aumente em muito. Aqui nós veremos uma dica simples, porém muito eficiente com relação a concatenação de string.
No Visual Basic, assim com na maioria das linguagens, o tempo gasto com a alocação de memória é bastante alto. Sim, o Visual Basic faz alocação de memória assim como qualquer outra linguagem de programação, o fato da alocação não ser explicita muitas vezes não significa que ela não exista.
Sendo assim, se conhecermos o tamanho da string final, depois das concatenações, ficaria muito mais eficiente se alocássemos uma vez apenas a string com o tamanho final e adicionássemos as substrings com a função Mid$.
Abaixo seguem dois códigos que terão o mesmo resultado, porém com um pequena diferença na implementação e veremos que o tempo gasto na execução é absurdamente diferente.
Crie um módulo e acrescente a chamada a API que será responsável por pegar a data do micro. Usaremos essa função para pegar a data no início e no fim do código, assim o tempo gasto será a diferença entre os 2 tempos.
'data do clock no formato long
Declare Function GetCurrentTime Lib "kernel32" Alias "GetTickCount" () As Long
Agora crie um form e acrescente 2 TextBox e 2 CommandButton.
No botão 1 acrescente o código a seguir.
Código 1.
Private Sub Command1_Click()
Dim i As Integer
Dim j As Integer
Dim t1 As Long
Dim t2 As Long
Dim texto As String
d1 = GetCurrentTime
For i = 1 To 300
For j = 1 To 300
texto = texto & "1"
DoEvents
Next
Next
d2 = GetCurrentTime
Text1.Text = CStr(d2 - d1)
End Sub
Neste código, para adicionar o caracter a string, o processador terá um trabalho árduo, ele terá que a cada laço alocar uma memória com o tamanho de 1 byte maior que a anterior, fazer a concatenação da string nesta nova área de memória e desalocar a string antiga.
O resultado, em minha máquina foi um tempo de 59786
No botão 2 acrescente o código a seguir.
Código 2.
Private Sub Command2_Click()
Dim i As Integer
Dim j As Integer
Dim k As Long
Dim t1 As Long
Dim t2 As Long
Dim texto As String
d1 = GetCurrentTime
texto = String(90000, 0)
k = 1
For i = 1 To 300
For j = 1 To 300
Mid$(texto, k, 1) = "1"
k = k + 1
DoEvents
Next
Next
d2 = GetCurrentTime
Text2.Text = CStr(d2 - d1)
End Sub
Neste código, nós alocamos um string com o tamanho total desejado e a cada loop, nós colocamos a substring no lugar desejado. O resultado na minha máquina foi um tempo de 241.
Comprando os resultado constatamos que o código 2 é aproximadamente 248 x mais rápido do que o código 1.
Atenção em alguns detalhes na hora da criação de um sistema podem fazer a diferença entre um código eficiente ou não.
Nenhum comentário:
Postar um comentário