Artigo: 170964 - Última revisão: quarta-feira, 11 de Outubro de 2006 - Revisão: 3.7

Como aumentar o desempenho de concatenação de cadeias

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 | Reduzir tudo

Sumário

Quando a concatenação de cadeias grandes na ordem dos 50 kb ou superior (por exemplo, criar uma tabela HTML a partir de uma base de dados), o período de tempo para concluir pode ficar muito longo como a cadeia é maior. Este artigo demonstra uma alternativa a concatenação normal que pode melhorar o desempenho de cadeias grandes por 20 vezes ou mais.

Mais Informação

Quando executar concatenations repetidos do tipo:
   For I = 1 To N
     Dest = Dest & Source
   Next N
				
aumenta o período de tempo ao proporcionalmente para N-quadrado. Por este motivo, 1000 iterações irão demorar cerca de 100 vezes mais do que 100 iterações. Isto é porque do Visual Basic não adiciona apenas os caracteres de origem para o fim da cadeia de destino; também executa as seguintes operações:

  1. Atribui memória temporária suficientemente grande para conter o resultado.
  2. Destino de cópias para o início da área temporária.
  3. Origem de cópias para o fim da área temporária.
  4. De-allocates cópia antiga do destino.
  5. Atribui memória para o destino suficientemente grande para conter o resultado.
  6. Copia os dados temporários para o destino.
Os passos 2 e 6 são muito dispendiosos e basicamente fazer com que o resultado concatenado inteiro a ser copiado duas vezes com sobrecarga adicional para atribuir e desalocar memória.

Este artigo fornece detalhes sobre um método utilizando a instrução de $ Mid e pre-allocating memória em blocos maiores para eliminar todos excepto o passo 3 acima para a maior parte da fase concatenação.

AVISO: A UTILIZAÇÃO POR SI O CÓDIGO FORNECIDO NESTE ARTIGO É DA RESPONSABILIDADE DO UTILIZADOR. A Microsoft fornece este código "tal como está" sem garantias de qualquer tipo, expressas ou implícita, incluindo sem limitação as garantias implícitas de comercialização e/ou adequação a um fim específico.

Exemplo passo a passo

  1. Escreva o seguinte código num 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 Immediate/Debug, escreva Test_Concat e prima a tecla ENTER.

    Os resultados serão semelhante à:
          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 demorar alguns minutos para ser executado.
  2. ObterContagemMarcaEscala devolve o número de milissegundos desde que o Windows foi iniciado. Por conseguinte, a saída é em milissegundos.
  3. Melhoramento do desempenho intervalos de quase 30 horas para o caso de 1000 iteração para quase 200 horas para o caso de iteração 5000. Estes períodos de tempo podem variar dependendo:

    • O produto utilizado.
    • A configuração do sistema
    • O tamanho do ccIncrement (tamanho maior favorece MidConcat).
    • O número de iterações utilizado (mais iterações favorece MidConcat).
    • O tamanho da cadeia de conjunto de políticas resultante (tamanho maior favorece MidConcat).

Referências

Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
306821  (http://support.microsoft.com/kb/306821/EN-US/ ) Como aumentar o desempenho de concatenação da cadeia de caracteres 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 16-bit Enterprise Edition
  • Microsoft Visual Basic 4.0 32-Bit 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )