Page 1 sur 1

Milliseconde en wk day hr min sec

Publié : jeu. 09/mars/2023 16:25
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)

Re: Milliseconde en wk day hr min sec

Publié : jeu. 09/mars/2023 17:12
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.

Re: Milliseconde en wk day hr min sec

Publié : jeu. 09/mars/2023 17:23
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)

Re: Milliseconde en wk day hr min sec

Publié : ven. 10/mars/2023 7:40
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 ?