Calcul du temps de calcul

Calcul du temps de calcul - VB/VBA/VBS - Programmation

Marsh Posté le 21-02-2014 à 17:05:44    

Bonjour à tous,
 
Je viens vers vous car j'ai un problème de longueur de temps de calcul avec un code, le code met plusieurs jours à tourner...  
Ce code reste assez simple, il s'agit de 2 boucles imbriquées comportant chacunes des formules à calculer. Cependant l'une de ses boucles doit être répétée un grand nombre de fois (plus de 1000 fois). J'aimerais cibler exactement ce qui pose problème dans cette boucle et pour cela j'aimerais déterminer très précisément le temps de chaque opération de calcul. Là est donc ma question, connaissez-vous une fonction ou un bout de code permettant d'avoir une estimation du temps utilisé? Je l'afficherais ensuite par le biais d'une Msgbox.
 
En vous remerciant par avance,
 
Jérémy

Reply

Marsh Posté le 21-02-2014 à 17:05:44   

Reply

Marsh Posté le 21-02-2014 à 19:57:10    

Peut être ça http://support.microsoft.com/kb/213481 :

Code :
  1. Sub ElapsedTime()
  2.    Dim StartTime As Double, EndTime As Double
  3.    'Stores start time in variable "StartTime"
  4.    StartTime = Timer
  5.    'Place your code to be timed here
  6.    'Stores end time in variable "EndTime"
  7.    EndTime = Timer
  8.    'Prints execution time in the debug window
  9.    Debug.Print "Execution time in seconds: ", EndTime - StartTime
  10. 'Shows Message Box with elapsed time
  11.    MsgBox "Execution time in seconds: " + Format$(EndTime - StartTime)
  12. End Sub


Reply

Marsh Posté le 24-02-2014 à 09:57:41    

Il faut que tu désactives le calcul automatique je pense. A mettre avant la boucle :
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
 
à mettre après :
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.Calculate


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-02-2014 à 11:44:50    

Merci beaucoup honrisse, je n'avais pas réussi à la trouver, ça marche bien; Je vais pouvoir plus facilement identifier ce qui cloche dans ce programme qui n'est pas le mien.
 
rufo dans le programme Application.ScreenUpdating y était déjà, j'ai rajouté le calculation pour désactiver le calcul automatiquement mais étrangement, ça m'a rallongé mon temps de calcul.

Reply

Marsh Posté le 24-02-2014 à 14:05:29    

 
           Bonjour Jérémy,
 
           A lire !
 

Reply

Marsh Posté le 25-02-2014 à 09:52:39    

Merci Marc pour le lien. J'ai ajouté application.enable events, je viens de gagner 0,1 s.
Je ne comprends pas bien l'histoire des tableaux. Si on veut accélérer un code il vaut mieux utiliser des tableaux que des colonnes?
Sinon est-ce que les opérations du type if dans une boucle prenne un temps important? Ou les appels à des sous fonctions?  
En effet comme je vous l'ai dit, il s'agit de boucle imbriqués, ce qui peut nous faire arriver à faire tourner 70 millions de boucles (objectif de la macro). Or actuellement j'arrive après diverses modifications suite à vos conseils à faire tourner dans un temps raisonnable (30 secondes), mais seulement 50 000 boucles. Il m'est donc impératif de diviser par au moins 1000 le temps de ma boucle.
Est-ce qu'excel peut arriver à le faire, 70 millions de boucles?
 
En vous remerciant encore

Reply

Marsh Posté le 25-02-2014 à 10:18:37    

70 millions de boucles  :pt1cable:  
 
Déjà que sur un logiciel compilé (genre écrit en C/C++), ça prendrait du temps, mais avec une macro (donc interprété), c'est même pas la peine... :sarcastic:  
 
Je pense que tu devrais passer d'Excel vers un SGBD. Probablement que tes calculs pourraient se faire direct avec les fonctions du SGBD en qq minutes.
Ex que j'ai fait : calcul via du SQL du produit d'une matrice de 4000x4000 avec sa transposée, ladite matrice étant stockée dans une table Myisam (Mysql). Ca mettait environ 20 mins. Le même calcul (extract de la matrice en CSV, calcul, recharge du CSV en base) avec un programme écrit en C, ça mettait 3 mins ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 26-02-2014 à 10:11:23    

Excuse mon ignorance mais qu'est-ce qu'un SGBD? Est-ce un logiciel detype C/C++?  
 
Ton calcul matriciel est au minimum aussi compliqué en terme de boucles que le mien, peut-être est-ce possible qu'en passant sur du fortran ou du C, mes boucle gagnent en vitesse? On peut gagner jusqu'à combien en passant sur un logiciel compilé?

Reply

Marsh Posté le 26-02-2014 à 20:29:41    

Par curiosité, c'est quoi comme calcul?
Une de tes boucles ne servirait pas à chercher une/des donnée dans une/des autres feuille par hasard?


---------------
il s'appel le ronge me doute
Reply

Marsh Posté le 26-02-2014 à 23:39:20    

Le temps de traitement , ça dépend vraiment du type de traitement. Exemple idiot chez moi 70*10^6 boucle de x = x+1 ça dure moins d'une seconde et ça semble linéaire avec le nombre d'opération (x=x+1, x = x*2, x=x/2, dure un peu moins de 3 secondes). Mais j’admets que j'ai des doutes sur la possibilité même d'y parvenir pour de tels volume...
Le même code en java (et C) dure moins de 0,3 secondes, c'est dire la "lenteur" du VBA (x10)
 
Peut-tu donner ton algorithme/ton code pour se faire une idée? Il est plus probable que le temps vienne de l'accès aux données à calculer que le calcul lui même. L'optimisation passe souvent par des trucs bêtes.
 
Mais si l'algo est vraiment lourd, il faut passer à autre chose, du style : excel ==> csv + java (ou tout autre language "rapide" par rapport au VBA) ==> csv==> excel


Message édité par dreameddeath le 26-02-2014 à 23:42:21
Reply

Marsh Posté le 26-02-2014 à 23:39:20   

Reply

Marsh Posté le 27-02-2014 à 10:17:00    

SGBD = système de gestion de bases de données (relationnelles, les BD en général).
 
C'est clair qu'un langage compilé est largement plus rapide que de l'interprété. Mis à part l'assembleur, le C est ce qu'il y a de plus rapide...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 27-02-2014 à 14:14:59    

J'aimerais pouvoir vous montrer mon code, le problème est qu'il est assez long (300lignes). L'idée du code est de calculer la concentration d'un gaz à différentes distances de son point d'émission.
L'émission peut-être de trois types :  
-une seule bouffée instantanée
-un rejet long avec un débit continu
-Une succession de bouffées ayant des débits différents connu sous le nom de multi-bouffées.
Bien entendu le cas le plus réaliste est aussi le plus compliqué, c'est à dire le multi-bouffées. :) Là encore, je vous montrerai bien la formule mais elle n'est dispo sur le net et je ne peux pas joindre de fichier sur le forum.


Message édité par jeremylg le 27-02-2014 à 14:15:35
Reply

Marsh Posté le 27-02-2014 à 14:32:43    

Calcul scientifique -> programme en C/C++ si tu veux que ça soit rapide. Moi qui avait un programme en php, je faisais via php et mysql, un export de ma matrice en csv, j'appelais via php un binaire en C qui prenait en entrée le fichier csv, faisait le calcul (3 mins au lieu de 20 avec Mysql) et sortait un fichier csv que j'importais dans mysql. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 27-02-2014 à 17:40:21    

300 lignes, il y en a qui ont fait pire sur le forum...
 
Perso, avant d'aller dans le C/C++ je conseillerais le java en première approche car :
- c'est plus simple à compiler (un jdk et c'est parti)
- c'est plus simple à coder (syntaxe plus simple pour les cas basiques, pas de distinction pointeur/valeur/référence, pas de core dump/gestion mémoire)
- il n'est pas forcément si lent (facteur 2 au pire, si pas trop de gestion mémoire)
 
en plus si ça marche, mais que tu as toujours des pbs de perfs, c'est assez facile pour des applis de calcul de se porter en C++ (qui est aussi un langage objet)...  
 
Mais si l'algo est parallélisable, il est aussi possible d'aller regarder du coté du multi-threading (avec du Java ou du C++ - v11, cela va sans dire)
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed