ID do artigo: 170964 - Última revisão: quarta-feira, 11 de outubro de 2006 - Revisão: 3.7

Como melhorar o desempenho de concatenação de seqüência

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Quando concatenando cadeias de caracteres grandes na ordem de 50 kb ou maior (por exemplo, criação de uma tabela HTML de um banco de dados), o período de tempo para concluir pode se tornar bastante longo como a seqüência de caracteres é maior. Este artigo demonstra uma alternativa para concatenação normal que pode melhorar o desempenho para grandes seqüências de caracteres por 20 vezes ou mais.

Mais Informações

Ao executar concatenações repetidas do tipo:
   For I = 1 To N
     Dest = Dest & Source
   Next N
				
o período de tempo aumenta proporcionalmente a N-quadrado. Portanto, 1000 iterações levará aproximadamente 100 vezes mais de 100 iterações. Isso é porque Visual Basic não adiciona apenas os caracteres de origem para o final da seqüência de destino; ele também executa as seguintes operações:

  1. Aloca memória temporária suficiente para armazenar o resultado.
  2. Cópias de destino para o início da área temporária.
  3. Fonte de cópias para o final da área temporária.
  4. De-allocates a cópia antiga do destino.
  5. Aloca memória para destino suficientemente grande para armazenar o resultado.
  6. Copia os dados temporários para o destino.
As etapas 2 e 6 são muito caras e basicamente resultam em todo o concatenados resultado sendo copiado duas vezes com uma sobrecarga adicional para alocar e de-allocate memória.

Este artigo detalha um método usando a instrução de $ Mid e pre-allocating memória em blocos maiores para eliminar todos, exceto a etapa 3 acima para a maioria da fase de concatenação.

AVISO: QUALQUER USO QUE VOCÊ O CÓDIGO FORNECIDO NESTE ARTIGO É DE SUA RESPONSABILIDADE. A Microsoft fornece esse código "como estão" sem garantia de qualquer tipo, expressa ou implícita, inclusive mas não limitada às garantias implícitas de comercialização e/ou adequação a uma finalidade específica.

Exemplo passo a passo

  1. Digite o seguinte código em um módulo:
          Option Explicit
    
          ' For 16-bit products, uncomment the next three lines by removing the
          ' single quotes and add a single quote to comment out the following
          ' three lines.
          '  Const ConcatStr = "ABC"
          '  Const ccIncrement = 15000
          '  Declare Function GetTickCount Lib "USER" () As Long
    
             Const ConcatStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             Const ccIncrement = 50000
    
             Private Declare Function GetTickCount Lib "KERNEL32" () As Long
    
          Dim ccOffset As Long
    
          Sub StdConcat(ByVal LoopCount As Long)
          Dim BigStr As String, I As Long, StartTick As Long
            StartTick = GetTickCount()
            For I = 1 To LoopCount
              BigStr = BigStr & ConcatStr
            Next I
            Debug.Print LoopCount; "concatenations took";
            Debug.Print GetTickCount() - StartTick; "ticks"
          End Sub
    
          Sub Test_Concat()
            Debug.Print "Using standard concatenation"
            StdConcat 1000
            StdConcat 2000
            StdConcat 3000
            StdConcat 4000
            StdConcat 5000
            Debug.Print
            Debug.Print "Using pre-allocated storage and pseudo-concatenation"
            MidConcat 1000
            MidConcat 2000
            MidConcat 3000
            MidConcat 4000
            MidConcat 5000
          End Sub
    
          Sub Concat(Dest As String, Source As String)
          Dim L As Long
            L = Len(Source)
            If (ccOffset + L) >= Len(Dest) Then
              If L > ccIncrement Then
                Dest = Dest & Space$(L)
              Else
                Dest = Dest & Space$(ccIncrement)
              End If
            End If
            Mid$(Dest, ccOffset + 1, L) = Source
            ccOffset = ccOffset + L
          End Sub
    
          Sub MidConcat(ByVal LoopCount As Long)
          Dim BigStr As String, I As Long, StartTick As Long
            StartTick = GetTickCount()
            ccOffset = 0
            For I = 1 To LoopCount
              Concat BigStr, ConcatStr
            Next I
            BigStr = Left$(BigStr, ccOffset)
            Debug.Print LoopCount; "pseudo-concatenations took";
            Debug.Print GetTickCount() - StartTick; "ticks"
          End Sub
    						
  2. Na janela Debug/imediata, digite Test_Concat e pressione a tecla ENTER.

    Os resultados terá aparência semelhantes à:
          Using standard concatenation
           1000 concatenations took 2348 ticks
           2000 concatenations took 8954 ticks
           3000 concatenations took 20271 ticks
           4000 concatenations took 35103 ticks
           5000 concatenations took 54453 ticks
    
          Using pre-allocated storage and pseudo-concatenation
           1000 pseudo-concatenations took 82 ticks
           2000 pseudo-concatenations took 124 ticks
           3000 pseudo-concatenations took 165 ticks
           4000 pseudo-concatenations took 247 ticks
           5000 pseudo-concatenations took 289 ticks

Informações adicionais

  1. O código pode levar alguns minutos para ser executado.
  2. ObterContagemMarcaEscala retorna o número de milissegundos desde inicialização do Windows. Portanto, a saída é em milissegundos.
  3. Varia de aperfeiçoamento de desempenho de quase 30 vezes para o caso de iteração de 1000 para quase 200 vezes para o caso de iteração 5000. Estas horas podem variar dependendo:

    • O produto usado.
    • A configuração do sistema
    • O tamanho do ccIncrement (maior tamanho favorece MidConcat).
    • O número de iterações usado (mais iterações favorece MidConcat).
    • O tamanho da seqüência de caracteres resultante (maior tamanho favorece MidConcat).

Referências

Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
306821  (http://support.microsoft.com/kb/306821/EN-US/ ) Como melhorar o desempenho de concatenação de seqüência no Visual Basic .NET

A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 de 16 bits Enterprise Edition
  • Microsoft Visual Basic 4.0 de 32 Bits Enterprise Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Access 1.0 Standard Edition
  • Microsoft Access 1.1 Standard Edition
  • Microsoft Access 2.0 Standard Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Word 97 Standard Edition
Palavras-chave: 
kbmt kbhowto kbprogramming KB170964 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 170964  (http://support.microsoft.com/kb/170964/en-us/ )