Milliseconde en wk day hr min sec

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Milliseconde en wk day hr min sec

Message par falsam »

Convertir les millisecondes en wk day hr min sec. C'est l'objectif de cette procédure.

Code : Tout sélectionner

Procedure.s MsToTime(NbMs)
  Protected weeks, days, hours, minutes, seconds
  Protected divisor, remainder
  Protected duration$ = ""
  Protected NbSeconds = NbMs/1000
  
  ; Calcul
  divisor = 7 * 24 * 60 * 60 ; seconds in a week
  weeks = NbSeconds / divisor
  remainder = NbSeconds % divisor
  
  divisor / 7 ; seconds in a day
  days = remainder / divisor
  remainder % divisor
  
  divisor / 24 ; seconds in an hour
  hours = remainder / divisor
  remainder % divisor
  
  divisor / 60 ; seconds in a minute
  minutes = remainder / divisor
  seconds = remainder % divisor
  
  
  ; Mise en forme du résultat
  If weeks > 0
    duration$ + Str(weeks) + " wk, "
  EndIf
  
  If days > 0
    duration$ + Str(days) + " day, "
  EndIf
  
  If hours > 0
    duration$ + Str(hours) + " hr, "
  EndIf
  
  If minutes > 0
    duration$ + Str(minutes) + " min, "
  EndIf
  
  If seconds > 0
    duration$ + Str(seconds) + " sec"
  EndIf
  
  If Right(duration$, 2) = ", "
    duration$ = Mid(duration$, 0, Len(duration$) - 2)
  EndIf
  
  ProcedureReturn duration$
EndProcedure

Debug MsToTime(182308)

Il y a t'il un moyen de l'améliorer ? D'avance merci :wink:

:!: P.S. Cette procédure fonctionne avec un temps d'au moins 1 seconde (1000 millisecondes)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Milliseconde en wk day hr min sec

Message par Naheulf »

Tu peut au moins simplifier le calcul des différentes composantes en faisant comme ça :

Code : Tout sélectionner

  #MS_IN_SEC  = 1000
  #MS_IN_MIN  = 1000 * 60
  #MS_IN_HOUR = 1000 * 60 * 60
  #MS_IN_DAY  = 1000 * 60 * 60 * 24
  #MS_IN_WEEK = 1000 * 60 * 60 * 24 * 7
  
  weeks   = NbMs               / #MS_IN_WEEK
  days    = NbMs % #MS_IN_WEEK / #MS_IN_DAY
  hours   = NbMs % #MS_IN_DAY  / #MS_IN_HOUR
  minutes = NbMs % #MS_IN_HOUR / #MS_IN_MIN
  seconds = NbMs % #MS_IN_MIN  / #MS_IN_SEC
Ça permet de gagner 3 divisions et en plus ça rend le calcul des différents éléments indépendant ce qui devrais en téorie permettre une meilleure exploitation du pipeline du cpu (au moins avec pb 6+)
Note : je n'ai pas comparé les performances réelles avec celles de ton code.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Milliseconde en wk day hr min sec

Message par falsam »

Voila qui est parfait. Merci beaucoup Naheulf

Le nouveau code

Code : Tout sélectionner

#MS_IN_SEC  = 1000
#MS_IN_MIN  = 1000 * 60
#MS_IN_HOUR = 1000 * 60 * 60
#MS_IN_DAY  = 1000 * 60 * 60 * 24
#MS_IN_WEEK = 1000 * 60 * 60 * 24 * 7
  
Procedure.s MsToTime(NbMs)
  Protected weeks, days, hours, minutes, seconds
  Protected divisor, remainder
  Protected duration$ = ""
  Protected NbSeconds = NbMs/1000
  
  ; Calcul 
  weeks   = NbMs               / #MS_IN_WEEK
  days    = NbMs % #MS_IN_WEEK / #MS_IN_DAY
  hours   = NbMs % #MS_IN_DAY  / #MS_IN_HOUR
  minutes = NbMs % #MS_IN_HOUR / #MS_IN_MIN
  seconds = NbMs % #MS_IN_MIN  / #MS_IN_SEC
  
  ; Mise en forme du résultat
  If weeks > 0
    duration$ + Str(weeks) + " wk, "
  EndIf
  
  If days > 0
    duration$ + Str(days) + " day, "
  EndIf
  
  If hours > 0
    duration$ + Str(hours) + " hr, "
  EndIf
  
  If minutes > 0
    duration$ + Str(minutes) + " min, "
  EndIf
  
  If seconds > 0
    duration$ + Str(seconds) + " sec"
  EndIf
  
  If Right(duration$, 2) = ", "
    duration$ = Mid(duration$, 0, Len(duration$) - 2)
  EndIf
  
  ProcedureReturn duration$
EndProcedure

Debug MsToTime(182308)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Milliseconde en wk day hr min sec

Message par Ollivier »

Si l'objectif est la performance, utiliser l'assembleur en ligne. Ça ne coûtera que 5 opérations de division. La performance est-elle l'objectif ?
Répondre