Coverage Report

Created: 2026-04-10 05:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/util/pretty_printer.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
// This file is copied from
18
// https://github.com/apache/impala/blob/branch-2.9.0/be/src/util/pretty-printer.h
19
// and modified by Doris
20
21
#pragma once
22
23
#include <gen_cpp/RuntimeProfile_types.h>
24
25
#include <boost/algorithm/string.hpp>
26
#include <cmath>
27
#include <iomanip>
28
#include <sstream>
29
30
#include "core/binary_cast.hpp"
31
#include "util/cpu_info.h"
32
33
/// Truncate a double to offset decimal places.
34
65.0k
#define DOUBLE_TRUNCATE(val, offset) floor(val* pow(10, offset)) / pow(10, offset)
35
36
namespace doris {
37
38
/// Methods for printing numeric values with optional units, or other types with an
39
/// applicable operator<<.
40
class PrettyPrinter {
41
public:
42
0
    static std::string print(bool value, TUnit::type ignored, bool verbose = false) {
43
0
        std::stringstream ss;
44
0
        ss << std::boolalpha << value;
45
0
        return ss.str();
46
0
    }
47
48
    /// Prints the 'value' in a human friendly format depending on the data type.
49
    /// i.e. for bytes: 3145728 -> 3MB
50
    /// If verbose is true, this also prints the raw value (before unit conversion) for
51
    /// types where this is applicable.
52
    template <typename T>
53
    static typename std::enable_if<std::is_arithmetic<T>::value, std::string>::type print(
54
19.4M
            T value, TUnit::type unit, bool verbose = false) {
55
19.4M
        std::stringstream ss;
56
19.4M
        ss.flags(std::ios::fixed);
57
19.4M
        switch (unit) {
58
0
        case TUnit::NONE: {
59
            // TUnit::NONE is used as a special counter, it is just a label
60
            //         - PeakMemoryUsage:
61
            //              - BuildKeyArena: 0
62
            //              - ProbeKeyArena: 0
63
            // So do not need output its value
64
0
            return ss.str();
65
0
        }
66
67
2.62k
        case TUnit::UNIT: {
68
2.62k
            std::string nest_unit;
69
2.62k
            double output = get_unit(value, &nest_unit);
70
2.62k
            if (nest_unit.empty()) {
71
2.61k
                ss << value;
72
2.61k
            } else {
73
5
                ss << std::setprecision(PRECISION) << output << nest_unit;
74
5
            }
75
2.62k
            if (verbose) {
76
0
                ss << " (" << value << ")";
77
0
            }
78
2.62k
            break;
79
0
        }
80
81
0
        case TUnit::UNIT_PER_SECOND: {
82
0
            std::string nest_unit;
83
0
            double output = get_unit(value, &nest_unit);
84
0
            if (output == 0) {
85
0
                ss << "0";
86
0
            } else {
87
0
                ss << std::setprecision(PRECISION) << output << " " << nest_unit << "/sec";
88
0
            }
89
0
            break;
90
0
        }
91
92
0
        case TUnit::CPU_TICKS: {
93
0
            if (value < CpuInfo::cycles_per_ms()) {
94
0
                ss << std::setprecision(PRECISION) << (value / 1000.) << "K clock cycles";
95
0
            } else {
96
0
                value /= CpuInfo::cycles_per_ms();
97
0
                print_timems(value, &ss);
98
0
            }
99
0
            break;
100
0
        }
101
102
65.0k
        case TUnit::TIME_NS: {
103
65.0k
            ss << std::setprecision(TIME_NS_PRECISION);
104
65.0k
            if (value >= BILLION) {
105
                /// If the time is over a second, print it up to ms.
106
13
                value /= MILLION;
107
13
                print_timems(value, &ss);
108
65.0k
            } else if (value >= MILLION) {
109
                /// if the time is over a ms, print it up to microsecond in the unit of ms.
110
31.0k
                ss << DOUBLE_TRUNCATE(static_cast<double>(value) / MILLION, TIME_NS_PRECISION)
111
31.0k
                   << "ms";
112
34.0k
            } else if (value > 1000) {
113
                /// if the time is over a microsecond, print it using unit microsecond
114
2.92k
                ss << DOUBLE_TRUNCATE(static_cast<double>(value) / 1000, TIME_NS_PRECISION) << "us";
115
31.1k
            } else {
116
31.1k
                ss << DOUBLE_TRUNCATE(value, TIME_NS_PRECISION) << "ns";
117
31.1k
            }
118
65.0k
            break;
119
0
        }
120
121
0
        case TUnit::TIME_MS: {
122
0
            print_timems(value, &ss);
123
0
            break;
124
0
        }
125
126
0
        case TUnit::TIME_S: {
127
0
            print_timems(value * 1000, &ss);
128
0
            break;
129
0
        }
130
131
19.3M
        case TUnit::BYTES: {
132
19.3M
            std::string nest_unit;
133
19.3M
            double output = get_byte_unit(value, &nest_unit);
134
19.3M
            if (output == 0) {
135
5.69M
                ss << "0";
136
13.6M
            } else {
137
13.6M
                ss << std::setprecision(PRECISION) << output << " " << nest_unit;
138
13.6M
                if (verbose) {
139
0
                    ss << " (" << value << ")";
140
0
                }
141
13.6M
            }
142
19.3M
            break;
143
0
        }
144
145
0
        case TUnit::BYTES_PER_SECOND: {
146
0
            std::string nest_unit;
147
0
            double output = get_byte_unit(value, &nest_unit);
148
0
            ss << std::setprecision(PRECISION) << output << " " << nest_unit << "/sec";
149
0
            break;
150
0
        }
151
152
        /// TODO: Remove DOUBLE_VALUE. IMPALA-1649
153
0
        case TUnit::DOUBLE_VALUE: {
154
0
            double output = binary_cast<T, double>(value);
155
0
            ss << std::setprecision(PRECISION) << output << " ";
156
0
            break;
157
0
        }
158
159
0
        default:
160
0
            DCHECK(false) << "Unsupported TUnit: " << value;
161
0
            break;
162
19.4M
        }
163
19.4M
        return ss.str();
164
19.4M
    }
_ZN5doris13PrettyPrinter5printIlEENSt9enable_ifIXsr3std13is_arithmeticIT_EE5valueENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4typeES3_NS_5TUnit4typeEb
Line
Count
Source
54
19.3M
            T value, TUnit::type unit, bool verbose = false) {
55
19.3M
        std::stringstream ss;
56
19.3M
        ss.flags(std::ios::fixed);
57
19.3M
        switch (unit) {
58
0
        case TUnit::NONE: {
59
            // TUnit::NONE is used as a special counter, it is just a label
60
            //         - PeakMemoryUsage:
61
            //              - BuildKeyArena: 0
62
            //              - ProbeKeyArena: 0
63
            // So do not need output its value
64
0
            return ss.str();
65
0
        }
66
67
2.62k
        case TUnit::UNIT: {
68
2.62k
            std::string nest_unit;
69
2.62k
            double output = get_unit(value, &nest_unit);
70
2.62k
            if (nest_unit.empty()) {
71
2.61k
                ss << value;
72
2.61k
            } else {
73
5
                ss << std::setprecision(PRECISION) << output << nest_unit;
74
5
            }
75
2.62k
            if (verbose) {
76
0
                ss << " (" << value << ")";
77
0
            }
78
2.62k
            break;
79
0
        }
80
81
0
        case TUnit::UNIT_PER_SECOND: {
82
0
            std::string nest_unit;
83
0
            double output = get_unit(value, &nest_unit);
84
0
            if (output == 0) {
85
0
                ss << "0";
86
0
            } else {
87
0
                ss << std::setprecision(PRECISION) << output << " " << nest_unit << "/sec";
88
0
            }
89
0
            break;
90
0
        }
91
92
0
        case TUnit::CPU_TICKS: {
93
0
            if (value < CpuInfo::cycles_per_ms()) {
94
0
                ss << std::setprecision(PRECISION) << (value / 1000.) << "K clock cycles";
95
0
            } else {
96
0
                value /= CpuInfo::cycles_per_ms();
97
0
                print_timems(value, &ss);
98
0
            }
99
0
            break;
100
0
        }
101
102
50.6k
        case TUnit::TIME_NS: {
103
50.6k
            ss << std::setprecision(TIME_NS_PRECISION);
104
50.6k
            if (value >= BILLION) {
105
                /// If the time is over a second, print it up to ms.
106
10
                value /= MILLION;
107
10
                print_timems(value, &ss);
108
50.6k
            } else if (value >= MILLION) {
109
                /// if the time is over a ms, print it up to microsecond in the unit of ms.
110
16.6k
                ss << DOUBLE_TRUNCATE(static_cast<double>(value) / MILLION, TIME_NS_PRECISION)
111
16.6k
                   << "ms";
112
34.0k
            } else if (value > 1000) {
113
                /// if the time is over a microsecond, print it using unit microsecond
114
2.91k
                ss << DOUBLE_TRUNCATE(static_cast<double>(value) / 1000, TIME_NS_PRECISION) << "us";
115
31.1k
            } else {
116
31.1k
                ss << DOUBLE_TRUNCATE(value, TIME_NS_PRECISION) << "ns";
117
31.1k
            }
118
50.6k
            break;
119
0
        }
120
121
0
        case TUnit::TIME_MS: {
122
0
            print_timems(value, &ss);
123
0
            break;
124
0
        }
125
126
0
        case TUnit::TIME_S: {
127
0
            print_timems(value * 1000, &ss);
128
0
            break;
129
0
        }
130
131
19.3M
        case TUnit::BYTES: {
132
19.3M
            std::string nest_unit;
133
19.3M
            double output = get_byte_unit(value, &nest_unit);
134
19.3M
            if (output == 0) {
135
5.67M
                ss << "0";
136
13.6M
            } else {
137
13.6M
                ss << std::setprecision(PRECISION) << output << " " << nest_unit;
138
13.6M
                if (verbose) {
139
0
                    ss << " (" << value << ")";
140
0
                }
141
13.6M
            }
142
19.3M
            break;
143
0
        }
144
145
0
        case TUnit::BYTES_PER_SECOND: {
146
0
            std::string nest_unit;
147
0
            double output = get_byte_unit(value, &nest_unit);
148
0
            ss << std::setprecision(PRECISION) << output << " " << nest_unit << "/sec";
149
0
            break;
150
0
        }
151
152
        /// TODO: Remove DOUBLE_VALUE. IMPALA-1649
153
0
        case TUnit::DOUBLE_VALUE: {
154
0
            double output = binary_cast<T, double>(value);
155
0
            ss << std::setprecision(PRECISION) << output << " ";
156
0
            break;
157
0
        }
158
159
0
        default:
160
0
            DCHECK(false) << "Unsupported TUnit: " << value;
161
0
            break;
162
19.3M
        }
163
19.3M
        return ss.str();
164
19.3M
    }
_ZN5doris13PrettyPrinter5printImEENSt9enable_ifIXsr3std13is_arithmeticIT_EE5valueENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4typeES3_NS_5TUnit4typeEb
Line
Count
Source
54
39.5k
            T value, TUnit::type unit, bool verbose = false) {
55
39.5k
        std::stringstream ss;
56
39.5k
        ss.flags(std::ios::fixed);
57
39.5k
        switch (unit) {
58
0
        case TUnit::NONE: {
59
            // TUnit::NONE is used as a special counter, it is just a label
60
            //         - PeakMemoryUsage:
61
            //              - BuildKeyArena: 0
62
            //              - ProbeKeyArena: 0
63
            // So do not need output its value
64
0
            return ss.str();
65
0
        }
66
67
0
        case TUnit::UNIT: {
68
0
            std::string nest_unit;
69
0
            double output = get_unit(value, &nest_unit);
70
0
            if (nest_unit.empty()) {
71
0
                ss << value;
72
0
            } else {
73
0
                ss << std::setprecision(PRECISION) << output << nest_unit;
74
0
            }
75
0
            if (verbose) {
76
0
                ss << " (" << value << ")";
77
0
            }
78
0
            break;
79
0
        }
80
81
0
        case TUnit::UNIT_PER_SECOND: {
82
0
            std::string nest_unit;
83
0
            double output = get_unit(value, &nest_unit);
84
0
            if (output == 0) {
85
0
                ss << "0";
86
0
            } else {
87
0
                ss << std::setprecision(PRECISION) << output << " " << nest_unit << "/sec";
88
0
            }
89
0
            break;
90
0
        }
91
92
0
        case TUnit::CPU_TICKS: {
93
0
            if (value < CpuInfo::cycles_per_ms()) {
94
0
                ss << std::setprecision(PRECISION) << (value / 1000.) << "K clock cycles";
95
0
            } else {
96
0
                value /= CpuInfo::cycles_per_ms();
97
0
                print_timems(value, &ss);
98
0
            }
99
0
            break;
100
0
        }
101
102
14.4k
        case TUnit::TIME_NS: {
103
14.4k
            ss << std::setprecision(TIME_NS_PRECISION);
104
14.4k
            if (value >= BILLION) {
105
                /// If the time is over a second, print it up to ms.
106
3
                value /= MILLION;
107
3
                print_timems(value, &ss);
108
14.4k
            } else if (value >= MILLION) {
109
                /// if the time is over a ms, print it up to microsecond in the unit of ms.
110
14.4k
                ss << DOUBLE_TRUNCATE(static_cast<double>(value) / MILLION, TIME_NS_PRECISION)
111
14.4k
                   << "ms";
112
14.4k
            } else if (value > 1000) {
113
                /// if the time is over a microsecond, print it using unit microsecond
114
8
                ss << DOUBLE_TRUNCATE(static_cast<double>(value) / 1000, TIME_NS_PRECISION) << "us";
115
8
            } else {
116
0
                ss << DOUBLE_TRUNCATE(value, TIME_NS_PRECISION) << "ns";
117
0
            }
118
14.4k
            break;
119
0
        }
120
121
0
        case TUnit::TIME_MS: {
122
0
            print_timems(value, &ss);
123
0
            break;
124
0
        }
125
126
0
        case TUnit::TIME_S: {
127
0
            print_timems(value * 1000, &ss);
128
0
            break;
129
0
        }
130
131
25.0k
        case TUnit::BYTES: {
132
25.0k
            std::string nest_unit;
133
25.0k
            double output = get_byte_unit(value, &nest_unit);
134
25.0k
            if (output == 0) {
135
15.7k
                ss << "0";
136
15.7k
            } else {
137
9.39k
                ss << std::setprecision(PRECISION) << output << " " << nest_unit;
138
9.39k
                if (verbose) {
139
0
                    ss << " (" << value << ")";
140
0
                }
141
9.39k
            }
142
25.0k
            break;
143
0
        }
144
145
0
        case TUnit::BYTES_PER_SECOND: {
146
0
            std::string nest_unit;
147
0
            double output = get_byte_unit(value, &nest_unit);
148
0
            ss << std::setprecision(PRECISION) << output << " " << nest_unit << "/sec";
149
0
            break;
150
0
        }
151
152
        /// TODO: Remove DOUBLE_VALUE. IMPALA-1649
153
0
        case TUnit::DOUBLE_VALUE: {
154
0
            double output = binary_cast<T, double>(value);
155
0
            ss << std::setprecision(PRECISION) << output << " ";
156
0
            break;
157
0
        }
158
159
0
        default:
160
0
            DCHECK(false) << "Unsupported TUnit: " << value;
161
0
            break;
162
39.5k
        }
163
39.5k
        return ss.str();
164
39.5k
    }
165
166
    /// For non-arithmetics, just write the value as a string and return it.
167
    //
168
    /// TODO: There's no good is_string equivalent, so there's a needless copy for strings
169
    /// here.
170
    template <typename T>
171
    static typename std::enable_if<!std::is_arithmetic<T>::value, std::string>::type print(
172
79
            const T& value, TUnit::type unit) {
173
79
        std::stringstream ss;
174
79
        ss << std::boolalpha << value;
175
79
        return ss.str();
176
79
    }
177
178
    /// Utility method to print an iterable type to a stringstream like [v1, v2, v3]
179
    template <typename I>
180
    static void print_stringList(const I& iterable, TUnit::type unit, std::stringstream* out) {
181
        std::vector<std::string> strings;
182
        for (typename I::const_iterator it = iterable.begin(); it != iterable.end(); ++it) {
183
            std::stringstream ss;
184
            ss << PrettyPrinter::print(*it, unit);
185
            strings.push_back(ss.str());
186
        }
187
188
        (*out) << "[" << boost::algorithm::join(strings, ", ") << "]";
189
    }
190
191
    /// Convenience method
192
18.8M
    static std::string print_bytes(int64_t value) {
193
18.8M
        return value >= 0 ? PrettyPrinter::print(value, TUnit::BYTES)
194
18.8M
                          : "-" + PrettyPrinter::print(std::abs(value), TUnit::BYTES);
195
18.8M
    }
196
197
private:
198
    static const int PRECISION = 2;
199
    static const int TIME_NS_PRECISION = 3;
200
    static const int64_t KILOBYTE = 1024;
201
    static const int64_t MEGABYTE = KILOBYTE * 1024;
202
    static const int64_t GIGABYTE = MEGABYTE * 1024;
203
204
    static const int64_t SECOND = 1000;
205
    static const int64_t MINUTE = SECOND * 60;
206
    static const int64_t HOUR = MINUTE * 60;
207
208
    static const int64_t THOUSAND = 1000;
209
    static const int64_t MILLION = THOUSAND * 1000;
210
    static const int64_t BILLION = MILLION * 1000;
211
212
    template <typename T>
213
19.3M
    static double get_byte_unit(T value, std::string* unit) {
214
19.3M
        if (value == 0) {
215
5.69M
            *unit = "";
216
5.69M
            return value;
217
13.6M
        } else if (value >= GIGABYTE) {
218
6.52M
            *unit = "GB";
219
6.52M
            return value / (double)GIGABYTE;
220
7.15M
        } else if (value >= MEGABYTE) {
221
6.39M
            *unit = "MB";
222
6.39M
            return value / (double)MEGABYTE;
223
6.39M
        } else if (value >= KILOBYTE) {
224
721k
            *unit = "KB";
225
721k
            return value / (double)KILOBYTE;
226
721k
        } else {
227
37.7k
            *unit = "B";
228
37.7k
            return value;
229
37.7k
        }
230
19.3M
    }
_ZN5doris13PrettyPrinter13get_byte_unitIlEEdT_PNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
213
19.3M
    static double get_byte_unit(T value, std::string* unit) {
214
19.3M
        if (value == 0) {
215
5.67M
            *unit = "";
216
5.67M
            return value;
217
13.6M
        } else if (value >= GIGABYTE) {
218
6.52M
            *unit = "GB";
219
6.52M
            return value / (double)GIGABYTE;
220
7.14M
        } else if (value >= MEGABYTE) {
221
6.39M
            *unit = "MB";
222
6.39M
            return value / (double)MEGABYTE;
223
6.39M
        } else if (value >= KILOBYTE) {
224
713k
            *unit = "KB";
225
713k
            return value / (double)KILOBYTE;
226
713k
        } else {
227
36.2k
            *unit = "B";
228
36.2k
            return value;
229
36.2k
        }
230
19.3M
    }
_ZN5doris13PrettyPrinter13get_byte_unitImEEdT_PNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
213
25.0k
    static double get_byte_unit(T value, std::string* unit) {
214
25.0k
        if (value == 0) {
215
15.7k
            *unit = "";
216
15.7k
            return value;
217
15.7k
        } else if (value >= GIGABYTE) {
218
0
            *unit = "GB";
219
0
            return value / (double)GIGABYTE;
220
9.39k
        } else if (value >= MEGABYTE) {
221
379
            *unit = "MB";
222
379
            return value / (double)MEGABYTE;
223
9.01k
        } else if (value >= KILOBYTE) {
224
7.51k
            *unit = "KB";
225
7.51k
            return value / (double)KILOBYTE;
226
7.51k
        } else {
227
1.49k
            *unit = "B";
228
1.49k
            return value;
229
1.49k
        }
230
25.0k
    }
231
232
    template <typename T>
233
2.62k
    static double get_unit(T value, std::string* unit) {
234
2.62k
        if (value >= BILLION) {
235
0
            *unit = "B";
236
0
            return value / (1. * BILLION);
237
2.62k
        } else if (value >= MILLION) {
238
5
            *unit = "M";
239
5
            return value / (1. * MILLION);
240
2.61k
        } else if (value >= THOUSAND) {
241
1
            *unit = "K";
242
1
            return value / (1. * THOUSAND);
243
2.61k
        } else {
244
2.61k
            *unit = "";
245
2.61k
            return value;
246
2.61k
        }
247
2.62k
    }
_ZN5doris13PrettyPrinter8get_unitIlEEdT_PNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
233
2.62k
    static double get_unit(T value, std::string* unit) {
234
2.62k
        if (value >= BILLION) {
235
0
            *unit = "B";
236
0
            return value / (1. * BILLION);
237
2.62k
        } else if (value >= MILLION) {
238
5
            *unit = "M";
239
5
            return value / (1. * MILLION);
240
2.61k
        } else if (value >= THOUSAND) {
241
1
            *unit = "K";
242
1
            return value / (1. * THOUSAND);
243
2.61k
        } else {
244
2.61k
            *unit = "";
245
2.61k
            return value;
246
2.61k
        }
247
2.62k
    }
Unexecuted instantiation: _ZN5doris13PrettyPrinter8get_unitImEEdT_PNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
248
249
    /// Utility to perform integer modulo if T is integral, otherwise to use fmod().
250
    template <typename T>
251
    static typename boost::enable_if_c<boost::is_integral<T>::value, int64_t>::type mod(
252
13
            const T& value, const int modulus) {
253
13
        return value % modulus;
254
13
    }
_ZN5doris13PrettyPrinter3modIlEEN5boost11enable_if_cIXsr5boost11is_integralIT_EE5valueElE4typeERKS4_i
Line
Count
Source
252
10
            const T& value, const int modulus) {
253
10
        return value % modulus;
254
10
    }
_ZN5doris13PrettyPrinter3modImEEN5boost11enable_if_cIXsr5boost11is_integralIT_EE5valueElE4typeERKS4_i
Line
Count
Source
252
3
            const T& value, const int modulus) {
253
3
        return value % modulus;
254
3
    }
255
256
    template <typename T>
257
    static typename boost::enable_if_c<!boost::is_integral<T>::value, double>::type mod(
258
            const T& value, int modulus) {
259
        return fmod(value, 1. * modulus);
260
    }
261
262
    /// Print the value (time in ms) to ss
263
    template <typename T>
264
13
    static void print_timems(T value, std::stringstream* ss) {
265
13
        DCHECK_GE(value, static_cast<T>(0));
266
13
        if (value == 0) {
267
0
            *ss << "0";
268
13
        } else {
269
13
            bool hour = false;
270
13
            bool minute = false;
271
13
            bool second = false;
272
13
            if (value >= HOUR) {
273
0
                *ss << static_cast<int64_t>(value / HOUR) << "h";
274
0
                value = mod(value, HOUR);
275
0
                hour = true;
276
0
            }
277
13
            if (value >= MINUTE) {
278
0
                *ss << static_cast<int64_t>(value / MINUTE) << "m";
279
0
                value = mod(value, MINUTE);
280
0
                minute = true;
281
0
            }
282
13
            if (!hour && value >= SECOND) {
283
13
                *ss << static_cast<int64_t>(value / SECOND) << "s";
284
13
                value = mod(value, SECOND);
285
13
                second = true;
286
13
            }
287
13
            if (!hour && !minute) {
288
13
                if (second) *ss << std::setw(3) << std::setfill('0');
289
13
                *ss << static_cast<int64_t>(value) << "ms";
290
13
            }
291
13
        }
292
13
    }
_ZN5doris13PrettyPrinter12print_timemsIlEEvT_PNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE
Line
Count
Source
264
10
    static void print_timems(T value, std::stringstream* ss) {
265
10
        DCHECK_GE(value, static_cast<T>(0));
266
10
        if (value == 0) {
267
0
            *ss << "0";
268
10
        } else {
269
10
            bool hour = false;
270
10
            bool minute = false;
271
10
            bool second = false;
272
10
            if (value >= HOUR) {
273
0
                *ss << static_cast<int64_t>(value / HOUR) << "h";
274
0
                value = mod(value, HOUR);
275
0
                hour = true;
276
0
            }
277
10
            if (value >= MINUTE) {
278
0
                *ss << static_cast<int64_t>(value / MINUTE) << "m";
279
0
                value = mod(value, MINUTE);
280
0
                minute = true;
281
0
            }
282
10
            if (!hour && value >= SECOND) {
283
10
                *ss << static_cast<int64_t>(value / SECOND) << "s";
284
10
                value = mod(value, SECOND);
285
10
                second = true;
286
10
            }
287
10
            if (!hour && !minute) {
288
10
                if (second) *ss << std::setw(3) << std::setfill('0');
289
10
                *ss << static_cast<int64_t>(value) << "ms";
290
10
            }
291
10
        }
292
10
    }
_ZN5doris13PrettyPrinter12print_timemsImEEvT_PNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE
Line
Count
Source
264
3
    static void print_timems(T value, std::stringstream* ss) {
265
3
        DCHECK_GE(value, static_cast<T>(0));
266
3
        if (value == 0) {
267
0
            *ss << "0";
268
3
        } else {
269
3
            bool hour = false;
270
3
            bool minute = false;
271
3
            bool second = false;
272
3
            if (value >= HOUR) {
273
0
                *ss << static_cast<int64_t>(value / HOUR) << "h";
274
0
                value = mod(value, HOUR);
275
0
                hour = true;
276
0
            }
277
3
            if (value >= MINUTE) {
278
0
                *ss << static_cast<int64_t>(value / MINUTE) << "m";
279
0
                value = mod(value, MINUTE);
280
0
                minute = true;
281
0
            }
282
3
            if (!hour && value >= SECOND) {
283
3
                *ss << static_cast<int64_t>(value / SECOND) << "s";
284
3
                value = mod(value, SECOND);
285
3
                second = true;
286
3
            }
287
3
            if (!hour && !minute) {
288
3
                if (second) *ss << std::setw(3) << std::setfill('0');
289
3
                *ss << static_cast<int64_t>(value) << "ms";
290
3
            }
291
3
        }
292
3
    }
293
};
294
295
} // namespace doris