Programa Excel VBA funcionando apenas a 25% da velocidade

5

Eu tenho um programa VBA em execução no meu Acer Aspire S3 Ultrabook de quatro núcleos. O problema é que ele usa apenas 25% da CPU (os outros processos combinados usam ~ 1%). O laptop executa o Windows 8.0. A edição do Excel é 2013 (32 bits). Apenas 55% da RAM do sistema é usada, com o Excel usando metade dos 55%.

Acho que apenas 25% é usado porque apenas um núcleo é usado pelo Excel. No entanto, não tenho nada para apoiar essa teoria. Como faço para acelerar o programa?

Obrigado.

    
por tropical 28.07.2014 / 16:55

5 respostas

6

Parece que o programa que você está tentando usar é single threaded, o que significa que ele só pode usar um único núcleo, ele não sabe que os outros existem. Não há uma maneira concreta de acelerar isso, exceto comprar um processador com uma velocidade de clock de núcleo único mais rápida ou usar um programa que suporte multiencadeamento.

    
por 28.07.2014 / 17:02
11

Tudo abaixo se aplica ao Excel 2007 e versões anteriores. De acordo com o link @ Ƭᴇcʜιᴇ007 postado nos comentários acima , há algum suporte nativo para multithreading no Excel 2013. Dito isso, o aviso de apenas esquecê-lo, a menos que você seja um programador experiente, ainda se aplica.

Infelizmente, o VBA não suporta multithreading, portanto, seus cálculos de VBA serão limitados a um núcleo de seu processador.

No entanto, existe um método avançado de enganar o VBA para executar vários threads, gerando arquivos VBscript e executando-os simultaneamente. Isso contorna o problema executando seu código fora do processo do Excel e permite que o Windows gerencie os recursos alocados para os diferentes threads.

Dito isso, fazer isso funcionar significará, mais do que isso, repensar completamente a lógica do seu código (ou seja, você terá que descobrir como dividir as tarefas de uma maneira que faça sentido executá-las simultaneamente) , o que pode muito bem ser inviável para o seu projeto. Eu nunca implementei isso, então eu realmente não posso ajudá-lo com isso, mais do que dizendo o que eu já lhe contei.

Se você quiser entrar na toca do coelho, aqui está uma postagem interessante no blog que mostra um exemplo disso. Esteja avisado: a menos que você seja um programador experiente, é melhor esquecer essa ideia e aceitar que o VBA é executado em um único thread.

Outros recursos no Stack Overflow para a ousadia: link
link

Existem outras maneiras de otimizar seu código VBA sem usar vários segmentos. Sem ver o seu código, é impossível fazer sugestões pontuais, mas aqui estão alguns dos suspeitos do costume:

  • Carregue dados da sua planilha em uma matriz para processamento mais rápido. As interações com a planilha são um grande gargalo na execução do VBA e podem ser minimizadas pelo trabalho com matrizes.
  • Um problema relacionado é o Excel recalcular a pasta de trabalho após cada alteração feita em uma célula. Isso pode ser evitado configurando Application.Calculation = xlManual . Só não se esqueça de configurá-lo de volta para Application.Calculation = xlAutomatic antes de sair do seu Sub.
por 28.07.2014 / 17:38
2

Como outros disseram, o VBA nativamente não é multithreaded. Se você quiser acelerar, pode querer considerar escrever funções definidas pelo usuário (UDF) em outro idioma.

Eu recomendaria ExcelDNA e usando C # ou VB.Net. Eles são muito fáceis de usar se você já sabe como escrever algum C # e você pode controlar multithreading dentro do UDF.

link

    
por 28.07.2014 / 18:52
2

Disclaimer: esta não é uma resposta adequada, mas eu acho que existem muitos usuários que precisam encontrar este tipo de hind junto com outras respostas sobre o uso de apenas um núcleo e minha reputação é muito baixa para publicá-lo como um comentar.

Parece que o seu script VBA está usando apenas um núcleo e isso pode muito bem ser uma coisa boa!

Como outros já mencionaram em boas respostas, penso que é importante conhecer outros aspectos desta questão para ajudá-lo a encontrar uma solução adequada. Então, como você acelera o programa?

  • O uso de 100% da CPU na visão geral do sistema não significa que seu programa é o mais rápido possível : pode haver muitas coisas inúteis sendo feitas, tente pesquisar por "Otimizando o VBA para velocidade". Qualquer bom mecanismo de busca fornecerá algumas respostas úteis aqui na rede do Stack Exchange. Use o tempo gasto em cálculos e não para uso da CPU.
  • O VBA no Excel não é necessariamente a melhor ferramenta para fazer o trabalho : para cálculos de cálculos numerosos de longa duração, pode ser útil exportar os dados do Excel e usar alguma outra plataforma, dependendo da sua programação. Habilidades. Há muitos para escolher, alguns se integram muito bem com a plataforma Microsoft e têm desempenho consideravelmente melhor realizável (o fazendo coisas inúteis também se aplica aqui).
  • Correr 100% da CPU provavelmente não lhe dará um aumento de velocidade de 4x na execução de apenas 25% : dependendo de quão bom você acabar com seus cálculos, você poderá obter um aumento de 2x em 4 núcleos. Mas há casos que vão tão bem quanto quase aumento de 4x em 4 núcleos - por exemplo, se o cálculo a ser feito em cada linha for completamente independente de quaisquer outros dados em sua planilha. Veja A lei de Amdahl na Wikipedia.
  • Pode não valer a pena tentar usar mais núcleos : embora possa ser útil em alguns casos, fazer com que seu cálculo use mais de um núcleo pode ser (e geralmente é) uma ordem de magnitude mais difícil tarefa, exigindo uma especialização completa em técnicas de programação (consulte esta pergunta para visão geral).
  • Bônus: Talvez você não precise acelerar o programa. Se o cálculo levar, digamos, três minutos e você executá-lo apenas uma vez por dia, por que não se levantar da sua conta? cadeira para um pouco e esticar seus ossos duros? Você está arriscando gastar dias aprimorando o seu programa para poder executá-lo em dois minutos e trinta, o que compensa apenas em um longo prazo muito . Um bom programador só gasta seu tempo em otimização quando realmente vale a pena, então deixe-se inspirar por bons programadores :)
por 29.07.2014 / 11:01
0

Como os outros acima disseram, threading seria a resposta, mas não é realmente uma solução viável, e atualizar para 64 bits faria uma diferença insignificante. Uma coisa que você poderia tentar fazer é aumentar a prioridade do processo, você pode ver como fazer isso aqui .

É difícil dizer se isso tornará seu script mais rápido, já que pode haver outro gargalo em outras partes do programa (por exemplo, leitura / gravação de um disco), mas pelo menos deixará o Windows saber que é um maior prioridade do que seus outros processos.

    
por 28.07.2014 / 17:45