Desafio da Semana #2


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