5 votos

Excel VBA programa sólo del 25% de velocidad

Tengo una VBA programa que se ejecuta en mi quad-core Ultrabook Acer Aspire S3. El problema es que sólo se utiliza el 25% de la CPU (el resto de los procesos de uso combinado ~1%). El portátil funciona con Windows 8.0. La edición de Excel es de 2013 (32 bits). Sólo el 55% de la memoria RAM del sistema, se utiliza, con Excel utilizando la mitad de la del 55%.

Creo que tal vez sólo el 25% se utiliza debido a que sólo un núcleo es utilizado por Excel. Sin embargo, yo no tengo nada para respaldar esta teoría. ¿Cómo puedo acelerar el programa?

Gracias.

11voto

Todo lo siguiente se aplica a Excel 2007 y versiones anteriores. Según el enlace de @Ƭᴇcʜiᴇ007 publicado en los comentarios de arriba, hay algunas soporte nativo para múltiples hilos en Excel 2013. Dicho esto, la advertencia a olvidar que a menos que usted es un programador experimentado todavía se aplica.

Por desgracia, VBA no soporta multithreading, por lo que su VBA cálculos será limitado a un solo núcleo de su procesador.

Sin embargo, hay un método avanzado de engañar a VBA en la ejecución de múltiples subprocesos mediante la generación de archivos VBscript y ejecutar simultáneamente. Esto hace que todo el problema mediante la ejecución de su código fuera del proceso de Excel y permite a Windows para administrar los recursos asignados a los distintos hilos.

Dicho esto, conseguir que el trabajo será más que probable que digo completamente repensar la lógica de su código (es decir, usted tendrá que averiguar cómo repartir las tareas en una forma que tenga sentido para ellos para ejecutar de forma simultánea), que puede muy bien ser inviable para su proyecto. Nunca he aplicado esto a mí, así que realmente no puedo ayudarte con esto, nada más que por decir lo que ya he dicho a usted.

Si usted desea entrar en el agujero del conejo, sin embargo, he aquí un interesante post en el blog que muestra un ejemplo de este hecho. Se advierte que, a menos que usted es un experto programador, usted puede olvidarse de esta idea y simplemente aceptar que VBA se ejecuta en un único hilo.

Otros recursos de Stack Overflow para los atrevidos:
http://stackoverflow.com/q/19159025/657668
http://stackoverflow.com/q/5721564/657668

Por supuesto, hay otras maneras de optimizar el código de VBA sin el uso de múltiples hilos. Sin ver el código, es imposible hacer señaló sugerencias, pero aquí hay un par de los sospechosos habituales:

  • Cargar los datos de su hoja de cálculo en una matriz para un procesamiento más rápido. Interacciones con la hoja de cálculo son un cuello de botella importante en VBA de ejecución, y que puede ser minimizado mediante el trabajo con matrices.
  • Una cuestión conexa es la de Excel volver a calcular el libro después de cada cambio de celda. Esto puede evitarse estableciendo Application.Calculation = xlManual. Sólo asegúrese de volver a establecer Application.Calculation = xlAutomatic antes de salir de su Sub.

6voto

YetiFiasco Puntos 438

Me suena como el programa que se está intentando utilizar es de un solo subproceso, lo que significa que sólo puede utilizar un solo núcleo, no conoce a los otros existen. No hay realmente una manera concreta para aumentar tu velocidad, excepto para comprar un procesador con un ritmo más rápido de un solo núcleo velocidad de reloj o el uso de un programa que es compatible con multi-threading.

2voto

BlueTrin Puntos 146

Como otros dijeron, de forma nativa VBA no es multiproceso. Si desea acelerar puede que desee considerar la escritura de funciones definidas por el usuario (UDF) en otro idioma.

Yo recomendaría que usted ExcelDNA y usando C# o VB.Net. Son muy fáciles de usar si usted ya sabe cómo escribir un poco de C# y usted puede controlar múltiples hilos dentro de la UDF.

http://exceldna.codeplex.com/

2voto

Marius Iordache Puntos 211

Descargo de responsabilidad: esto no es una respuesta apropiada, pero me parece que hay muchos usuarios que necesitan para encontrar este tipo de hind, junto con otras respuestas relacionadas con el uso de sólo un núcleo y mi reputación es demasiado baja para publicar un comentario.

Parece que su secuencia de comandos VBA es el uso de sólo un núcleo, y que muy bien puede ser una buena cosa!

Como otros han mencionado ya, las buenas respuestas, creo que es importante conocer otros aspectos de esta cuestión para ayudarle a encontrar una solución adecuada. Entonces, ¿cómo acelerar el programa?

  • 100% de uso de CPU en el sistema de información general, no significa que su programa va tan rápido como pueda: puede haber muchas cosas inútiles que se está haciendo, trate de buscar 'la Optimización de VBA para la velocidad". Cualquier buen motor de búsqueda le dará algunas respuestas útiles aquí de la red de Intercambio de Pila. Ir por el tiempo empleado en el cálculo y no para el uso de la CPU.
  • VBA en Excel no es necesariamente la mejor herramienta para hacer el trabajo: para la ejecución larga compuadora cálculos puede ser útil para exportar los datos desde excel y utilizar alguna otra plataforma, dependiendo de sus habilidades de programación. Hay muchos para elegir, algunos se integran bien con la plataforma de Microsoft, y es considerablemente mejor alcanzable rendimiento ( haciendo cosas inútiles también aquí se aplica).
  • Ejecutar el 100% del CPU probablemente no le dará 4x aumento de la velocidad respecto a la ejecución de sólo el 25%: dependiendo de lo bueno que romper su cálculo, usted puede conseguir tan poco como 2x aumentar en 4 núcleos. Pero hay casos que van tan bien como casi 4x aumentar en 4 núcleos - por ejemplo, si el cálculo se hace en cada línea es completamente independiente de cualquier otro de los datos en la hoja de cálculo. Ver la ley de Amdahl en la Wikipedia.
  • Puede que no sea la pena intentar utilizar más núcleos: aunque puede ser útil en algunos casos, por lo que su cálculo el uso de más de un núcleo, puede ser (y generalmente lo es) un orden de magnitud más difícil, que requiere una amplia experiencia en técnicas de programación (véase esta cuestión para la visión general).
  • Bonus: tal vez usted no necesita para acelerar su programa. Si el cálculo se toma, por ejemplo, tres minutos y sólo se ejecuta una vez al día, ¿por qué no se levanta de su silla un poco y estirar la rigidez de los huesos? Usted está en riesgo de pasar días afinando su programa para poder ejecutarlo en dos minutos treinta, que paga sólo en un muy largo plazo. Un buen programador sólo pasa su tiempo en la optimización cuando realmente vale la pena, así que déjese inspirar por los buenos programadores:)

0voto

John M Raleigh Puntos 1

Al igual que los otros de arriba han dicho, roscado sería la respuesta, pero no es realmente una solución viable, y la actualización de 64 bits haría una diferencia insignificante. Una cosa que usted podría tratar de hacer es aumentar el proceso de la prioridad, puedes ver cómo hacerlo aquí.

Es difícil decir si o no que se realice la secuencia de comandos más rápido, ya que no puede ser otro cuello de botella en el resto del programa (por ejemplo, lectura/escritura de disco), pero por lo menos dejar que Windows sepa es una prioridad más alta que el resto de sus procesos.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: