segunda-feira, 6 de abril de 2009

Aumentando a performance na concatenação de string em VB


Contador de acessoVisitas


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

Advogados
Visitas