Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1128 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Calcul du temps de calcul

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Calcul du temps de calcul

n°2220458
jeremylg
Posté le 21-02-2014 à 17:05:44  profilanswer
 

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

mood
Publicité
Posté le 21-02-2014 à 17:05:44  profilanswer
 

n°2220476
honrisse
Posté le 21-02-2014 à 19:57:10  profilanswer
 

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


n°2220547
rufo
Pas me confondre avec Lycos!
Posté le 24-02-2014 à 09:57:41  profilanswer
 

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
n°2220561
jeremylg
Posté le 24-02-2014 à 11:44:50  profilanswer
 

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.

n°2220585
Marc L
Posté le 24-02-2014 à 14:05:29  profilanswer
 

 
           Bonjour Jérémy,
 
           A lire !
 

n°2220689
jeremylg
Posté le 25-02-2014 à 09:52:39  profilanswer
 

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

n°2220693
rufo
Pas me confondre avec Lycos!
Posté le 25-02-2014 à 10:18:37  profilanswer
 

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
n°2220816
jeremylg
Posté le 26-02-2014 à 10:11:23  profilanswer
 

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é?

n°2220881
Arl Guhr
Posté le 26-02-2014 à 20:29:41  profilanswer
 

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
n°2220896
dreameddea​th
Posté le 26-02-2014 à 23:39:20  profilanswer
 

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
mood
Publicité
Posté le 26-02-2014 à 23:39:20  profilanswer
 

n°2220929
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2014 à 10:17:00  profilanswer
 

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
n°2220959
jeremylg
Posté le 27-02-2014 à 14:14:59  profilanswer
 

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
n°2220963
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2014 à 14:32:43  profilanswer
 

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
n°2220996
dreameddea​th
Posté le 27-02-2014 à 17:40:21  profilanswer
 

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)
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Calcul du temps de calcul

 

Sujets relatifs
Calcul des rendements d'une action au cours du temps avec vbaOutil calcul temps génération de la page serveur
[Résolu] Besoin aide calcul temps en PHP[RESOLU] Calcul + affichage résultat en temps réel ?
[Excel/VBA] Temps de calcul / AttenteRécupérer valeurs sur un site web après un temps de calcul
Calcul du temps d'execution en millisecondescalcul temps
calcul du temps processeurOPTIMISATION D'ALGO POUR LE TEMPS DE CALCUL
Plus de sujets relatifs à : Calcul du temps de calcul


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR