@@ -35,48 +35,64 @@ bool GPUMeter_active(void) {
3535   return  activeMeters  >  0 ;
3636}
3737
38- static  int  humanTimeUnit (char *  buffer , size_t  size , unsigned long long int   value ) {
38+ static  int  humanTimeUnit (char *  buffer , size_t  size , unsigned long long  totalNanoseconds ) {
39+    if  (totalNanoseconds  <  10000 )
40+       return  xSnprintf (buffer , size , "%4uns" , (unsigned int  )totalNanoseconds );
3941
40-    if  (value  <  1000 )
41-       return  xSnprintf (buffer , size , "%3lluns" , value );
42- 
43-    if  (value  <  10000 )
44-       return  xSnprintf (buffer , size , "%1llu.%1lluus" , value  / 1000 , (value  % 1000 ) / 100 );
45- 
46-    value  /= 1000 ;
42+    unsigned long long  value  =  totalNanoseconds  / 100 ;
4743
4844   if  (value  <  1000 )
49-       return  xSnprintf (buffer , size , "%3lluus" , value );
45+       return  xSnprintf (buffer , size , "%u.%uus" , (unsigned int  )(value  / 10 ), (unsigned int  )(value  % 10 ));
46+ 
47+    value  /= 10 ; // microseconds 
5048
5149   if  (value  <  10000 )
52-       return  xSnprintf (buffer , size , "%1llu.%1llums" , value  / 1000 , (value  % 1000 ) / 100 );
50+       return  xSnprintf (buffer , size , "%4uus" , (unsigned int  )value );
51+ 
52+    value  /= 100 ;
53+ 
54+    unsigned long long  totalSeconds  =  value  / 10000 ;
55+    if  (totalSeconds  <  60 ) {
56+       int  width  =  4 ;
57+       unsigned int   seconds  =  (unsigned int  )totalSeconds ;
58+       unsigned int   fraction  =  (unsigned int  )(value  % 10000 );
59+       for  (unsigned int   limit  =  1 ; seconds  >= limit ; limit  *= 10 ) {
60+          width -- ;
61+          fraction  /= 10 ;
62+       }
63+       // "%.u" prints no digits if (seconds == 0). 
64+       return  xSnprintf (buffer , size , "%.u.%0*us" , seconds , width , fraction );
65+    }
5366
54-    value  /=  1000 ;
67+    value  =   totalSeconds ;
5568
56-    if  (value  <  1000 )
57-       return  xSnprintf (buffer , size , "%3llums " , value );
69+    if  (value  <  3600 )
70+       return  xSnprintf (buffer , size , "%2um%02us " , ( unsigned  int ) value  /  60 , ( unsigned  int ) value  %  60 );
5871
59-    if  (value  <  10000 )
60-       return  xSnprintf (buffer , size , "%1llu.%1llus" , value  / 1000 , (value  % 1000 ) / 100 );
72+    value  /= 60 ; // minutes 
73+ 
74+    if  (value  <  1440 )
75+       return  xSnprintf (buffer , size , "%2uh%02um" , (unsigned int  )value  / 60 , (unsigned int  )value  % 60 );
6176
62-    value  /= 1000 ; 
77+    value  /= 60 ;  // hours 
6378
64-    if  (value  <  600 )
65-       return  xSnprintf (buffer , size , "%3llus " , value );
79+    if  (value  <  2400 )
80+       return  xSnprintf (buffer , size , "%2ud%02uh " , ( unsigned  int ) value  /  24 , ( unsigned  int ) value  %  24 );
6681
67-    value  /= 60 ; 
82+    value  /= 24 ;  // days 
6883
69-    if  (value  <  600 )
70-       return  xSnprintf (buffer , size , "%3llum " , value );
84+    if  (value  <  365 )
85+       return  xSnprintf (buffer , size , "%5ud " , ( unsigned  int ) value );
7186
72-    value  /= 60 ;
87+    if  (value  <  3650 )
88+       return  xSnprintf (buffer , size , "%uy%03ud" , (unsigned int  )(value  / 365 ), (unsigned int  )(value  % 365 ));
7389
74-    if  (value  <  96 )
75-       return  xSnprintf (buffer , size , "%3lluh" , value );
90+    value  /= 365 ; // years (ignore leap years) 
7691
77-    value  /= 24 ;
92+    if  (value  <  100000 )
93+       return  xSnprintf (buffer , size , "%5luy" , (unsigned long )value );
7894
79-    return  xSnprintf (buffer , size , "%3llud"  ,  value );
95+    return  xSnprintf (buffer , size , "  inf."  );
8096}
8197
8298static  void  GPUMeter_updateValues (Meter *  this ) {
0 commit comments