• Sign in
 

LATAM Team blog

Search Blogs
Tags
  • Cloud
  • Cluster
  • Crash
  • Desarrollo
  • Desenvolvimento
  • Directory Services
  • DST
  • Español
  • Exchange/Outlook
  • Hang
  • High Availability
  • IIS
  • Networking
  • Office
  • People
  • Performance
  • Português
  • PowerShell Scripts
  • Security
  • Setup
  • Sharepoint
  • SQL
  • Virtualization
  • Windbg Scripts
  • Windows
Blog - News

Where Are You Coming From Today?

Where are you now?

Follow us on:

Options
  • Blog Home
  • About
  • Share this
  • RSS for posts
  • Atom
  • RSS for comments
Archive
Archives
  • May 2013 (4)
  • April 2013 (5)
  • March 2013 (6)
  • February 2013 (3)
  • January 2013 (3)
  • December 2012 (2)
  • November 2012 (1)
  • October 2012 (4)
  • September 2012 (5)
  • August 2012 (2)
  • July 2012 (2)
  • June 2012 (3)
  • May 2012 (13)
  • April 2012 (6)
  • March 2012 (6)
  • February 2012 (4)
  • January 2012 (7)
  • December 2011 (11)
  • October 2011 (6)
  • September 2011 (1)
  • August 2011 (3)
  • July 2011 (7)
  • June 2011 (6)
  • May 2011 (5)
  • April 2011 (2)
  • March 2011 (13)
  • February 2011 (1)
  • January 2011 (5)
  • December 2010 (6)
  • November 2010 (1)
  • October 2010 (6)
  • September 2010 (2)
  • August 2010 (3)
  • July 2010 (3)
  • June 2010 (5)
  • May 2010 (1)
  • April 2010 (10)
  • March 2010 (21)
  • February 2010 (8)
  • January 2010 (3)
  • December 2009 (5)
  • November 2009 (5)
  • October 2009 (6)
  • September 2009 (8)
  • August 2009 (9)
  • July 2009 (1)
  • June 2009 (3)
  • May 2009 (2)
  • April 2009 (7)
  • March 2009 (4)
  • February 2009 (7)
  • January 2009 (7)
  • December 2008 (8)
  • November 2008 (7)
  • October 2008 (22)
  • September 2008 (17)
  • August 2008 (13)
  • July 2008 (11)
  • June 2008 (7)
  • May 2008 (3)
  • April 2008 (2)
  • March 2008 (6)
  • January 2008 (4)
  • December 2007 (9)
  • November 2007 (4)
  • October 2007 (3)
  • September 2007 (8)
  • August 2007 (4)
  • July 2007 (2)
  • June 2007 (5)
  • May 2007 (7)
  • April 2007 (9)
  • March 2007 (7)
  • February 2007 (6)
  • January 2007 (4)
  • December 2006 (14)
  • November 2006 (10)
  • October 2006 (10)
  • September 2006 (11)
  • August 2006 (15)
  • July 2006 (7)
  • June 2006 (14)
  • May 2006 (22)
  • April 2006 (16)
  • March 2006 (20)
  • January 2006 (1)

Desafio da Semana #2

TechNet Blogs > LATAM Team blog > Desafio da Semana #2

Desafio da Semana #2

LatamBlog
21 Apr 2006 7:21 PM
  • Comments 5

 

DESAFIO DA SEMANA #2

 

Por: Roberto A. Farah

 

 

O desafio dessa semana foi feito pensando numa situação que encontramos por aqui com frequência. Problemas de performance em código legado, como, por exemplo, aplicações em Visual Basic 6. Na grande maioria das vezes temos que propor uma solução que seja a mais prática para nosso clientes, ou seja, a que menos exige dinheiro, recursos e mudanças drásticas para implementar. A solução ótima muitas vezes é se recomendar uma mudança de arquitetura, ou reescrita de alguma parte da aplicação, mas geralmente é a solução boa que acaba sendo escolhida: a otimização na parte identificada como sendo o gargalo de performance.

Certamente a mesma situação que vocês devem encontrar com seus clientes.

Pois bem, o Desafio da Semana está relacionado com isso.

 

SITUAÇÃO

 

Um cliente procura você para saber se você consegue otimizar uma rotina Visual Basic 6 que foi identificada pelos desenvolvedores como um dos gargalos de performance mais críticos da aplicação.

Portanto, você deve obter um baseline da performance atual para, posteriormente, medir com o código otimizado e quantificar o ganho de performance.

Para facilitar o código de medir performance está implementado. J

Então você deve criar uma rotina otimizada que execute mais rápido que a rotina atual.

Use apenas Visual Basic 6 para fazer a otimização.

 

Identifique:

 

PROBLEMA

 

O que está causando o gargalo de performance?

 

SOLUÇÃO

 

Apresente sua solução otimizada, que deve ser feita em Visual Basic 6.

 

Instruções:

 

a) Crie uma aplicação Visual Basic com essa interface e atributo Read-Only nos TextBox:

 

  

 

 

b) Crie um módulo .BAS e coloque:

 

Option Explicit

 

' Declara chamada de API para medir o tempo. QueryPeformanceCounter() e' mais precisa

' mas GetTickCount funciona para nossa aplicacao.

Declare Function GetTickCount Lib "Kernel32" () As Long

 

 

c) Abra o From1.frm e coloque:

 

 

 

Private Sub Command1_Click()

    Dim i As Double

    Dim lStartTime As Long

    Dim lFinalTime As Long

    Dim strText As String

   

    strText = "String para ser concatenada!!!"

   

    lStartTime = GetTickCount()

 

    For i = 0 To 9000000  ' Nao desenrole esse loop... :)

        Original strText  ' Chama rotina original.

    Next

   

    lFinalTime = GetTickCount() - lStartTime

   

    Text1.Text = CStr(lFinalTime)

End Sub

 

Private Sub Command2_Click()

    Dim i As Double

    Dim lStartTime As Long

    Dim lFinalTime As Long

    Dim strText As String

   

    strText = "String para ser concatenada!!!"

   

    lStartTime = GetTickCount()

   

    For i = 0 To 9000000  ' Nao desenrole esse loop... :)

        Optimized strText   ' Chama rotina original.

    Next

   

    lFinalTime = GetTickCount() - lStartTime

   

    Text2.Text = CStr(lFinalTime)

End Sub

 

 

' Fazer 10 concatenacoes de string.

Private Sub Original(ByVal strText As String)

    Dim strOutput As String

    Dim i As Integer

   

    strOutput = vbNullString

   

    For i = 1 To 10

        strOutput = strOutput + strText

    Next

   

End Sub

 

' Fazer 10 concatenacoes de string.

Private Sub Optimized(ByVal strText As String)

     SEU CÓDIGO VEM AQUI

End Sub

 

 

Otimize, teste para ver a performance, modifique, teste novamente e veja qual o máximo de performance você consegue obter.

Semana que vem apresentarei uma resposta e estou curioso para ver as abordagens apresentadas! J

 

 

  • 5 Comments
Desenvolvimento
Comments
Comments
  • Danilo Pimentel
    25 Apr 2006 2:26 PM
    Olá Amigos,

    Inicialmente queria parabenizar nosso amigo Roberto Farah pela iniciativa pelo site. Realmente há aqui informações de grande valia para todos nós!

    Fiz uma série de códigos afim de conseguir a máxima otimização para o problema proposto, segue abaixo toda a evolução até atingir o código mais otimizado.

    '=================================
    'CÓDIGO 1
    '=================================

    Dim strOutput As String
    Dim i As Integer

    strOutput = Space(Len(strText) * 10)

    For i = 1 To 10
     Mid$(strOutput, 1 + (i - 1) * Len(strText), Len(strText)) = strText
    Next

    '=================================
    'CÓDIGO 2
    '=================================

    Dim strOutput As String
    Dim i As Integer

    strOutput = Space(Len(strText) * 10)

    For i = 1 To Len(strText) * 10 Step Len(strText)
     Mid$(strOutput, i, Len(strText)) = strText
    Next

    '=================================
    'CÓDIGO 3
    '=================================

    Dim strOutput As String
    Dim i As Integer
    Dim Size As Integer

    Size = Len(strText)
    strOutput = Space(Size * 10)

    For i = 1 To Size * 10 Step Size
     Mid$(strOutput, i, Size) = strText
    Next

    '=================================
    'CÓDIGO 4
    '=================================

    Dim strOutput As String
    Dim i As Integer
    Dim Size As Integer
    Dim SizeFull As Integer

    Size = Len(strText)
    SizeFull = Size * 10

    strOutput = Space(SizeFull)

    For i = 1 To SizeFull Step Size
     Mid$(strOutput, i, Size) = strText
    Next

    '=================================
    'CÓDIGO 5
    '=================================

    Dim strOutput As String
    Dim i As Long
    Dim SizeB As Integer
    Dim SizeFullB As Long
    Dim p As Long
    Dim p2 As Long

    strOutput = Space(Len(strText) * 10)

    p = StrPtr(strText)
    p2 = StrPtr(strOutput)

    SizeB = LenB(strText)
    SizeFullB = p2 + SizeB * 10 - 1

    For i = p2 To SizeFullB Step SizeB
     CopyMemory2 i, p, SizeB
    Next

    Tabela com medições comparativas

    CÓDIGO | MEDIÇÃO 1 | MEDIÇÃO 2 | MEDIÇÃO 3 |  MÉDIA

     1        42468       42609      42484      42520,33
     2        36203       36266      36235      36234,67
     3        35937       35531      35844      35770
     4        35922       35391      35343      35552
     5        35125       35297      34875      35099
    Original   53422       53485      53109      53338,67


    METODOLOGIA/CONCLUSÕES

     A concatenação de string no Visual Basic realmente é lenta pois o Visual Basic nos disponibiliza a simplicidade máxima para trabalho com strings dinâmicas... Internamente, claro, ele precisa controlar alocação de memória, realocação, cópia de segmento de memória de um local para outro, etc, liberação, etc.

     Pensando nisso resolvi iniciar os testes tentando alocar a memória necessária de uma vez só e logo após ir preenchendo os segmentos com a string original, fazendo então a concatenação. Realmente o ganho de performance foi muito grande.

     Em seguida optei por reduzir o número de cálculos efetuados, fazendo que a posição para cópia dos trechos não fosse calculada dentro do For (Em código Visual Basic) mas sim na própria estrutura do For por meio do Step, o que resultou em um ganho de performance ainda maior.

     Os dois próximos passos experimentei retirar a chamada excessiva de funções e realização de cálculos, o que mais uma vez resultou em ganho de performance.

     Por fim resolvi então utilizar um CopyMemory diretamente para fazer a concatenação de strings para o buffer já alocado. Essa última alteração também resultou em ganho de performance, bem menos significativo (apenas 1.3% em relação a segunda melhor abordagem) mas que também será muito bem vindo, visto que o ideal é atingir a melhor performance.

    Abraços a todos.

    Danilo Pimentel
  • Danilo Pimentel
    25 Apr 2006 3:00 PM
    Olá amigos,

    Acabei de verificar um equívoco :-(

    Infelizmente postei o código 5 incorreto, esse aí é um código "pré 5" digamos assim! :-D

    O código 5 que gerou o resultado mostrado na tabela de medições é esse:

    '++++++++++++++++++++++++++++

    Dim strOutput As String
    Dim i As Long
    Dim SizeB As Integer
    Dim PstrText As Long
    Dim PStart As Long
    Dim PEnd As Long

    strOutput = Space(Len(strText) * 10)

    PstrText = StrPtr(strText)
    PStart = StrPtr(strOutput)

    SizeB = LenB(strText)
    PEnd = PStart + SizeB * 10 - 1

    For i = PStart To PEnd Step SizeB
     CopyMemory i, PstrText, SizeB
    Next

    '++++++++++++++++++++++++++++

    Abraços.

    Danilo Pimentel
  • Danilo Pimentel
    26 Apr 2006 1:29 PM
    Olá Amigos,

    Queria corrigir o código postado como CÓDIGO 5, esse que está aí não corresponde à medida realizada, essa era uma versão quando estava fazendo ainda a implementação. A versão final e que realmente gerou os valores apresentados segue abaixo:



    '++++++++++++++++++++++++++
    Dim strOutput As String
    Dim i As Long
    Dim SizeB As Integer
    Dim PstrText As Long
    Dim PStart As Long
    Dim PEnd As Long

    strOutput = Space(Len(strText) * 10)

    PstrText = StrPtr(strText)
    PStart = StrPtr(strOutput)

    SizeB = LenB(strText)
    PEnd = PStart + SizeB * 10 - 1

    For i = PStart To PEnd Step SizeB
     CopyMemory i, PstrText, SizeB
    Next
    '++++++++++++++++++++++++++

    Segue também declaração da CopyMemory:

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDestination As Long, ByVal pSource As Long, ByVal Length As Long)


    Abraços,

    Danilo Pimentel
  • Roberto Farah
    27 Apr 2006 4:01 PM
    Pessoal, como segunda-feira é feriado no Brasil e entendo que muita gente pode ter tido a semana apertada, vou deixar para postar a resposta (e os devidos elogios :) ) na próxima sexta assim dá tempo de mais gente postar.
    Obrigado!
  • Farah
    5 May 2006 12:41 PM
    Danilo, parabens pelas solucoes apresentadas! Voce apresentou nao uma mas duas otimas estragetias para otimizar a construcao original.
    Minha resposta é basicamente a mesma com uma pequena otimização adicional que em determinados cenários contribui para melhorar a performance ainda mais. Explicarei porque essas abordagens são mais rápidas e colocarei muitas dicas de otimização de código Visual Basic 6.
    Continue participando! :)
    Obrigado
Page 1 of 1 (5 items)
  • © 2013 Microsoft Corporation.
  • Terms of Use
  • Trademarks
  • Privacy & Cookies
  • 5.6.426.415
  • TechNet
  • Products
  • IT Resources
  • Downloads
  • Training
  • Support
Products
  • Windows
  • Windows
    Server
  • System
    Center
  • Internet
    Explorer
 
  • Office
  • Office 365
  • Exchange
    Server
 
  • SQL Server
  • SharePoint
    Products
  • Lync
  • See all products »
Resources
  • Evaluation Center
  • Learning Resources
  • Microsoft IT Camps
  • Microsoft Technical Communities
  • Microsoft Virtual Academy
  • Script Center
  • Server and Tools Blogs
  • Solution Accelerators
  • TechNet Blogs
 
  • TechNet Flash Newsletter
  • TechNet Gallery
  • TechNet Library
  • TechNet Magazine
  • TechNet Subscriptions
  • TechNet Video
  • TechNet Wiki
  • Windows Sysinternals
  • Virtual Labs
Solutions
  • Networking
  • Cloud and Datacenter
  • Security
  • Virtualization
Updates
  • Service Packs
  • Security Bulletins
  • Microsoft Update
Trials
  • Windows Server 2012
  • System Center 2012 SP1
  • Microsoft SQL Server 2012 SP1
  • Windows 8 Enterprise
  • See all trials »
Related Sites
  • Microsoft Download Center
  • TechNet Evaluation Center
  • Drivers
  • Compatability & Converters
  • Windows Sysinternals
  • TechNet Gallery
Training
  • Training Catalog
  • Class Locator
  • Microsoft Virtual Academy
  • Free Windows Server 2012 courses
  • Free Windows 8 courses
  • SQL Server training
  • e-Learning overview
Certifications
  • Certification overview
  • MCSA: Windows 8
  • Windows Server Certification (MCSE)
  • Private Cloud Certification (MCSE)
  • SQL Server Certification (MCSE)
Other resources
  • TechNet Events
  • Second shot for certification
  • Born To Learn blog
  • IT Camps
Support by product
  • Exchange Server
  • Forefront Server
  • Forefront Edge Security
  • Forefront Server Security
  • Internet Explorer
  • Office
  • SharePoint
 
  • SQL Server
  • System Center
  • Windows Server
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
Other support links
  • Microsoft Premier Online
  • Microsoft Fix It Center
  • TechNet Forums
  • MSDN Forums
  • Security Bulletins & Advisories
  • International support solutions
  • Log a support ticket
  • Look up event IDs and error codes
Not an IT pro?
  • Microsoft Customer Support
  • Microsoft Community Forums