O que é um software eficiente? Um software eficiente não deve apenas rodar mais rápido que um software que executa a mesma função, mas também consumir menos recursos do sistema. Este artigo reúne um pouco da experiência acumulada pelo autor ao usar VB para desenvolvimento de software e usa alguns exemplos simples para mostrar como escrever código VB eficiente. Ele contém algumas técnicas que podem ser muito úteis para programadores de VB. Antes de começar, deixe-me esclarecer alguns conceitos.
Deixe o código tomar forma imediatamente: Entre os programadores com quem entrei em contato, muitas pessoas gostam de escrever o código primeiro de acordo com os requisitos funcionais e depois otimizar o código com base nisso. No final, eles descobriram que, para conseguir a otimização, precisavam reescrever o código. Portanto, sugiro que você considere questões de otimização antes de escrever código.
Entenda a relação entre os resultados da otimização e o trabalho necessário: normalmente, quando um trecho de código é concluído, você precisa inspecioná-lo e modificá-lo. No processo de inspeção do código, você pode descobrir que a eficiência do código em alguns loops pode ser melhorada ainda mais. Neste caso, muitos programadores que buscam a perfeição podem modificar o código imediatamente. Minha sugestão é que se a alteração deste código reduzir o tempo de execução do programa em um segundo, você poderá alterá-lo. Se isso puder trazer apenas uma melhoria de desempenho de 10 milissegundos, nenhuma alteração será feita. Isso ocorre porque reescrever um trecho de código inevitavelmente introduzirá novos erros, e a depuração de um novo código certamente levará um certo tempo. Os programadores devem encontrar um equilíbrio entre o desempenho do software e a quantidade de trabalho necessária para desenvolvê-lo, e 10 milissegundos é uma diferença que os usuários não podem apreciar.
Tente usar métodos orientados a objetos quando precisar usá-los; o mecanismo fornecido pelo VB não oferece suporte total ao design e codificação orientados a objetos, mas o VB fornece classes simples. A maioria das pessoas acredita que o uso de objetos resultará em código menos eficiente. Pessoalmente, tenho opiniões diferentes sobre este ponto; a eficiência do código não pode ser avaliada apenas do ponto de vista da velocidade de execução. Os recursos ocupados pelo software também são um dos fatores que precisam ser considerados. O uso de classes pode ajudá-lo a melhorar o desempenho geral do seu software, o que explicarei em detalhes em exemplos posteriores.
Ao escrever código VB, espero que você possa usar os pontos acima como princípios para orientar sua codificação. Dividi o artigo em duas partes: como melhorar a velocidade de execução do código e otimização da compilação.
Como fazer seu código rodar mais rápido
Os métodos a seguir podem ajudá-lo a melhorar a velocidade do seu código:
1. Use números inteiros (inteiros) e inteiros longos (longos)
A maneira mais fácil de acelerar a execução do seu código é usar os tipos de dados corretos. Você pode não acreditar, mas escolher o tipo de dados correto pode melhorar muito o desempenho do seu código. Na maioria dos casos, os programadores podem substituir variáveis do tipo Single, Double e Currency por variáveis do tipo Integer ou Long, porque a capacidade do VB de lidar com Integer e Long é muito maior do que a de outros tipos de dados.
Na maioria dos casos, o motivo pelo qual os programadores optam por usar Single ou Double é a capacidade de salvar decimais. Mas os decimais também podem ser armazenados em variáveis do tipo Integer. Por exemplo, se houver três casas decimais acordadas no programa, basta dividir o valor armazenado na variável Integer por 1000 para obter o resultado. Na minha experiência, o código pode ser executado quase 10 vezes mais rápido usando Integer e Long em vez de Single, Double e Currency.
2. Evite usar variantes
Para um programador VB, isso é óbvio. Variáveis de tipos variantes requerem 16 bytes de espaço para armazenar dados, enquanto um número inteiro (inteiro) requer apenas 2 bytes. Normalmente, o objetivo do uso de tipos variantes é reduzir a carga de trabalho de design e a quantidade de código. Alguns programadores também o utilizam para evitar problemas. Mas se um software for estritamente projetado e codificado de acordo com as especificações, o uso de tipos variantes pode ser completamente evitado.
A propósito, o mesmo problema também existe para objetos Object. Por favor, veja o código abaixo:
mFSO
SetFSO=NewScripting.FileSystemObject
ou
DimFSOasobjeto
SetFSO=NewScripting.FileSystemObject
Como o código acima não especifica o tipo de dados ao declarar, memória e tempo de CPU serão desperdiçados durante a atribuição. O código correto deve ficar assim:
DimFSOasNewFileSystemObject
3. Tente evitar o uso de atributos
No código diário, o código ineficiente mais comum é usar repetidamente propriedades (Property) quando variáveis podem ser usadas, especialmente em loops. Você deve saber que a velocidade de acesso a variáveis é cerca de 20 vezes maior que a de acesso a atributos. O código a seguir é usado por muitos programadores em seus programas:
DimintConasInteger
ForintCon=0toUbound(SomVar())
Text1.Text=Text1.Text&vbcrlf&SomeVar(intCon)
NextintCon
O código abaixo é executado 20 vezes mais rápido que o código acima.
DimintConasInteger
DimsOutputasString
ForintCon=0toUbound(SomeVar())
sOutput=sOutput&vbCrlf&
SomeVar(intCon)
Próximo
Text1.Text=sSaída
4. Tente usar arrays e evite usar conjuntos
A menos que você precise usar uma coleção, você deve sempre usar um array. Segundo testes, a velocidade de acesso dos arrays pode chegar a 100 vezes a das coleções. Esse número parece um pouco chocante, mas se você considerar que uma coleção é um objeto, entenderá porque a diferença é tão grande.
5. Expanda o pequeno corpo do loop
Ao codificar, você pode encontrar esta situação: um corpo de loop fará um loop apenas 2 ou 3 vezes, e o corpo do loop consiste em várias linhas de código. Neste caso, você pode desenrolar o loop. A razão é que o loop ocupa tempo extra de CPU. Mas se o loop for mais complexo, você não precisa fazer isso.
6. Evite usar funções muito curtas
Tal como acontece com o uso de pequenos loops, não é econômico chamar uma função com apenas algumas linhas de código - chamar a função pode demorar mais do que executar o código na função. Nesse caso, você pode copiar o código da função para o local onde a função foi originalmente chamada.
7. Reduza referências a subobjetos
Em VB, as referências de objetos são implementadas usando . Por exemplo:
Formulário1.Texto1.Texto
No exemplo acima, o programa faz referência a dois objetos: Form1 e Text1. Citar usando este método é ineficiente. Mas, infelizmente, não há como evitá-lo. A única coisa que o programador pode fazer é usar With ou salvar o objeto filho (Texto1) com outro objeto.
Nota: Use com
WithfrmMain.Text1
.Text="AprendaVB"
.Alinhamento=0
.Tag="Éminhavida"
.BackColor=vbPreto
.ForeColor=vbBranco
Terminar com
ou
Nota: Use outro objeto para salvar o objeto filho
DimtxtTextBoxasTextBox
SettxtTextBox=frmMain.Text1
TxtTextBox.Text="AprenderVB"
TxtTextBox.Alignment=0
TxtTextBox.Tag="Itsmylife"
TxtTextBox.BackColor=vbPreto
TxtTextBox.ForeColor=vbBranco
Observe que o método mencionado acima só é aplicável quando você precisa operar em subobjetos de um objeto. O código a seguir está incorreto:
ComTexto1
.Text="AprendaVB"
.Alinhamento=0
.Tag="Éminhavida"
.BackColor=vbPreto
.ForeColor=vbBranco
Terminar com
Infelizmente, muitas vezes podemos encontrar código semelhante ao acima no código real. Fazer isso apenas tornará a execução do código mais lenta. A razão é que o bloco With formará uma ramificação após a compilação, o que adicionará trabalho de processamento adicional.
8. Verifique se a string está vazia
A maioria dos programadores usa o seguinte método para verificar se uma string está vazia:
IfText1.Text=""então
Nota: realizar operações
Endif
Infelizmente, fazer comparações de strings requer ainda mais processamento do que ler propriedades. Portanto, sugiro que você use o seguinte método:
IfLen(Text1.Text)=0então
Nota: realizar operações
Endif
9. Nome da variável após remover a próxima palavra-chave
Adicionar o nome da variável após a palavra-chave Next fará com que a eficiência do código diminua. Não sei por que isso acontece, é apenas uma experiência. Mas acho que poucos programadores chegariam ao ponto de adicionar informações supérfluas. Afinal, a maioria dos programadores são pessoas que apreciam palavras como ouro.
Comentário: Código errado
ForiCount=1to10
Nota: realizar operações
NextiCount
Nota: Código correto
ForiCount=1to10
Nota: realizar operações
Próximo
10. Use arrays em vez de múltiplas variáveis
Quando você tiver diversas variáveis que contêm dados semelhantes, considere substituí-las por um array. Em VB, arrays são uma das estruturas de dados mais eficientes.
11. Use arrays dinâmicos em vez de arrays estáticos
O uso de arrays dinâmicos não terá um grande impacto na velocidade de execução do código, mas em alguns casos pode economizar muitos recursos.
12. Destrua objetos
Não importa que tipo de software seja escrito, os programadores precisam considerar a liberação do espaço de memória ocupado pelo software depois que o usuário decidir encerrá-lo. Mas, infelizmente, muitos programadores parecem não se importar muito com isso. A abordagem correta é destruir os objetos usados no programa antes de sair do programa. Por exemplo:
DimFSOasNewFileSystemObject
Nota: realizar operações
Nota: Destrua o objeto
DefinirFSO=Nada
Para formulários, você pode desinstalar:
UnloadfrmPrincipal
ou
SetfrmMain=Nada
13. Strings de comprimento variável e comprimento fixo
Tecnicamente falando, strings de comprimento fixo requerem menos tempo e espaço de processamento do que strings de comprimento variável. No entanto, a desvantagem das strings de comprimento fixo é que, em muitos casos, você precisa chamar a função Trim para remover o caractere nulo no final da string, o que reduzirá a eficiência do código. Portanto, a menos que o comprimento da string não mude, use strings de comprimento variável.
14. Use módulos de classe em vez de controles ActiveX
A menos que os controles ActiveX envolvam interfaces de usuário, tente usar objetos leves, como classes. Há uma grande diferença de eficiência entre os dois.
15. Use objetos internos
Quando se trata de usar controles ActiveX e DLLs, muitos programadores gostam de compilá-los e adicioná-los ao projeto. Eu aconselho você a não fazer isso porque conectar-se a um objeto externo do VB requer muito poder de processamento da CPU. Cada vez que você chama um método ou acessa uma propriedade, você desperdiça muitos recursos do sistema. Se você tiver o código-fonte de um controle ActiveX ou DLL, torne-os objetos privados no projeto.
16. Reduza o número de módulos
Algumas pessoas gostam de manter funções comuns em módulos e eu concordo com isso. Mas escrever apenas vinte ou trinta linhas de código em um módulo é um pouco ridículo. Se você realmente não precisa de um módulo, tente não usá-lo. A razão para isso é porque o VB carrega módulos na memória apenas quando funções ou variáveis no módulo são chamadas. Esses módulos são descarregados da memória quando o aplicativo VB é encerrado; Se houver apenas um módulo no código, o VB executará apenas uma operação de carregamento, portanto a eficiência do código será melhorada, por outro lado, se houver vários módulos no código, o VB executará várias operações de carregamento e a eficiência de; o código será reduzido.
17. Use matrizes de objetos
Ao projetar interfaces de usuário, os programadores devem tentar usar matrizes de objetos para controles do mesmo tipo. Você pode fazer uma experiência: adicione 100 PictureBoxes à janela, cada uma com um nome diferente, e execute o programa. Em seguida, crie um novo projeto, adicione também 100 PictureBoxes à janela, mas desta vez use um array de objetos, execute o programa, você pode notar a diferença no tempo de carregamento dos dois programas.
18. Use o método Mover
Ao alterar a posição de um objeto, alguns programadores gostam de usar as propriedades Largura, Altura, Superior e Esquerda. Por exemplo:
Imagem1.Largura=100
Imagem1.Altura=100
Imagem1.Top=0
Imagem1.Esquerda=0
Na verdade, isso é muito ineficiente, pois o programa modifica quatro propriedades, e após cada modificação a janela será redesenhada. A abordagem correta é usar o método Move:
Imagem1.Move0,0,100,100
19. Reduza o uso de imagens
As imagens ocuparão muita memória e processá-las também requer muitos recursos da CPU. No software, se possível, considere usar cores de fundo em vez de imagens - é claro que esta é apenas a perspectiva de um técnico sobre o assunto.
20. Use ActiveXDLL em vez de controles ActiveX
Se o objeto ActiveX que você está projetando não envolver uma interface de usuário, use ActiveXDLL.
Otimização de compilação
Muitos programadores VB que conheci nunca usaram opções de compilação ou tentaram descobrir as diferenças entre as opções. Vamos dar uma olhada no significado específico de cada opção.
1. Código P (pseudocódigo) e código nativo
Você pode optar por compilar o software em código P ou código nativo. A opção padrão é código nativo. Então, o que são código P e código nativo?
Código P: Ao executar código em VB, o VB primeiro compila o código em código P e, em seguida, interpreta e executa o código P compilado. Em um ambiente compilado, usar esse código é mais rápido que o código nativo. Depois de selecionar P-Code, o VB coloca o pseudocódigo em um arquivo EXE durante a compilação.
Código nativo: o código nativo é uma opção introduzida somente após o VB6. Quando compilado em um arquivo EXE, o código nativo é executado mais rapidamente que o código P. Depois de selecionar o código nativo, o VB usa instruções de máquina para gerar um arquivo EXE durante a compilação.
Ao compilar com código nativo, descubro que às vezes são introduzidos erros inexplicáveis. Meu código é executado de forma totalmente correta no ambiente de compilação, mas o arquivo EXE gerado com a opção de código nativo não é executado corretamente. Geralmente isso acontece quando uma janela é descarregada ou uma janela de impressão aparece. Resolvi esse problema adicionando uma instrução DoEvent ao código. Claro, a chance de isso acontecer é muito rara. Talvez alguns programadores de VB nunca tenham encontrado isso, mas existe.
Existem também várias opções no código nativo:
a) Otimização da velocidade do código: Esta opção pode compilar um arquivo executável mais rápido, mas o arquivo executável é maior. Recomendado
b) Otimização do tamanho do código: Esta opção pode compilar um arquivo executável menor, mas em detrimento da velocidade, não é recomendada.
c) Sem otimização: Esta opção converte apenas o código P em código nativo sem qualquer otimização. Pode ser usado ao depurar código.
d) Otimizado para Pentium Pro: Embora esta opção não seja a opção padrão no código nativo, geralmente uso esta opção. O programa executável compilado com esta opção pode rodar mais rápido em máquinas PentiumPro e Pentium2 ou superiores, mas será um pouco mais lento em máquinas mais antigas. Considerando que o uso do Pentium2 está desatualizado, é recomendável que todos utilizem esta opção.
e) Gerar informações simbólicas de depuração: Este item gera algumas informações de depuração durante o processo de compilação, permitindo aos usuários utilizar ferramentas como Visual C++ para depurar o código compilado. Usar esta opção gera um arquivo .pdf que registra as informações do sinalizador no arquivo executável. Esta opção é útil quando o programa possui funções API ou chamadas DLL.
2. Otimização avançada
As configurações em Otimização Avançada podem ajudá-lo a melhorar a velocidade do seu software, mas às vezes podem introduzir bugs, por isso recomendo que você as use com o máximo de cuidado possível. Se houver corpos de loop relativamente grandes ou operações matemáticas complexas no código, a seleção de determinados itens na otimização avançada melhorará bastante o desempenho do código. Se você usa recursos avançados de otimização, recomendo testar rigorosamente os arquivos compilados.
a) Assumindo que não há alias: isso pode melhorar a eficiência de execução do código no corpo do loop, mas se o valor da variável for alterado por meio de uma referência de variável, como chamar um método, a referência de variável será usada como parâmetro do método, e o valor da variável for alterado no valor do método, um erro será gerado. Pode ser apenas que o resultado retornado esteja errado ou pode ser um erro grave que causa a interrupção do programa.
b) Cancelar verificação de ligação de array, cancelar verificação de estouro de inteiro e cancelar verificação de erro de ponto flutuante: Quando o programa estiver em execução, se erros forem encontrados por meio dessas verificações, o código de tratamento de erros tratará esses erros. Mas se essas verificações forem canceladas, o programa não será capaz de tratar o erro. Você deve usar essas opções somente se tiver certeza de que os erros acima não ocorrerão em seu código. Eles irão melhorar muito o desempenho do software.
c) Permitir operações de ponto flutuante sem arredondamento: Selecionar esta opção permite que o programa compilado processe operações de ponto flutuante mais rapidamente. Sua única desvantagem é que pode levar a resultados incorretos ao comparar dois números de ponto flutuante.
d) Cancelar verificação de segurança PentiumFDIV: Esta opção está definida para alguns chips Pentium antigos e agora parece estar desatualizada