@@ -35,48 +35,64 @@ bool GPUMeter_active(void) {
35
35
return activeMeters > 0 ;
36
36
}
37
37
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 );
39
41
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 ;
47
43
48
44
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
50
48
51
49
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
+ }
53
66
54
- value /= 1000 ;
67
+ value = totalSeconds ;
55
68
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 );
58
71
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 );
61
76
62
- value /= 1000 ;
77
+ value /= 60 ; // hours
63
78
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 );
66
81
67
- value /= 60 ;
82
+ value /= 24 ; // days
68
83
69
- if (value < 600 )
70
- return xSnprintf (buffer , size , "%3llum " , value );
84
+ if (value < 365 )
85
+ return xSnprintf (buffer , size , "%5ud " , ( unsigned int ) value );
71
86
72
- value /= 60 ;
87
+ if (value < 3650 )
88
+ return xSnprintf (buffer , size , "%uy%03ud" , (unsigned int )(value / 365 ), (unsigned int )(value % 365 ));
73
89
74
- if (value < 96 )
75
- return xSnprintf (buffer , size , "%3lluh" , value );
90
+ value /= 365 ; // years (ignore leap years)
76
91
77
- value /= 24 ;
92
+ if (value < 100000 )
93
+ return xSnprintf (buffer , size , "%5luy" , (unsigned long )value );
78
94
79
- return xSnprintf (buffer , size , "%3llud" , value );
95
+ return xSnprintf (buffer , size , " inf." );
80
96
}
81
97
82
98
static void GPUMeter_updateValues (Meter * this ) {
0 commit comments