1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker // histogram_macros.h: 7*8975f5c5SAndroid Build Coastguard Worker // Helpers for making histograms, to keep consistency with Chromium's 8*8975f5c5SAndroid Build Coastguard Worker // histogram_macros.h. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_HISTOGRAM_MACROS_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_HISTOGRAM_MACROS_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <platform/PlatformMethods.h> 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_TIMES(name, sample) ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, 1, 10000, 50) 16*8975f5c5SAndroid Build Coastguard Worker 17*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_MEDIUM_TIMES(name, sample) \ 18*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, 10, 180000, 50) 19*8975f5c5SAndroid Build Coastguard Worker 20*8975f5c5SAndroid Build Coastguard Worker // Use this macro when times can routinely be much longer than 10 seconds. 21*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_LONG_TIMES(name, sample) \ 22*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, 1, 3600000, 50) 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker // Use this macro when times can routinely be much longer than 10 seconds and 25*8975f5c5SAndroid Build Coastguard Worker // you want 100 buckets. 26*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_LONG_TIMES_100(name, sample) \ 27*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, 1, 3600000, 100) 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker // For folks that need real specific times, use this to select a precise range 30*8975f5c5SAndroid Build Coastguard Worker // of times you want plotted, and the number of buckets you want used. 31*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) \ 32*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_COUNTS(name, sample) \ 35*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 1000000, 50) 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_COUNTS_100(name, sample) \ 38*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 100, 50) 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_COUNTS_10000(name, sample) \ 41*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 10000, 50) 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) \ 44*8975f5c5SAndroid Build Coastguard Worker ANGLEPlatformCurrent()->histogramCustomCounts(ANGLEPlatformCurrent(), name, sample, min, max, \ 45*8975f5c5SAndroid Build Coastguard Worker bucket_count) 46*8975f5c5SAndroid Build Coastguard Worker 47*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \ 48*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101) 49*8975f5c5SAndroid Build Coastguard Worker 50*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_BOOLEAN(name, sample) \ 51*8975f5c5SAndroid Build Coastguard Worker ANGLEPlatformCurrent()->histogramBoolean(ANGLEPlatformCurrent(), name, sample) 52*8975f5c5SAndroid Build Coastguard Worker 53*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_ENUMERATION(name, sample, boundary_value) \ 54*8975f5c5SAndroid Build Coastguard Worker ANGLEPlatformCurrent()->histogramEnumeration(ANGLEPlatformCurrent(), name, sample, \ 55*8975f5c5SAndroid Build Coastguard Worker boundary_value) 56*8975f5c5SAndroid Build Coastguard Worker 57*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_MEMORY_KB(name, sample) \ 58*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1000, 500000, 50) 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_MEMORY_MB(name, sample) \ 61*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 1000, 50) 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_SPARSE_SLOWLY(name, sample) \ 64*8975f5c5SAndroid Build Coastguard Worker ANGLEPlatformCurrent()->histogramSparse(ANGLEPlatformCurrent(), name, sample) 65*8975f5c5SAndroid Build Coastguard Worker 66*8975f5c5SAndroid Build Coastguard Worker // Scoped class which logs its time on this earth as a UMA statistic. This is 67*8975f5c5SAndroid Build Coastguard Worker // recommended for when you want a histogram which measures the time it takes 68*8975f5c5SAndroid Build Coastguard Worker // for a method to execute. This measures up to 10 seconds. 69*8975f5c5SAndroid Build Coastguard Worker #define SCOPED_ANGLE_HISTOGRAM_TIMER(name) \ 70*8975f5c5SAndroid Build Coastguard Worker SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, false, __COUNTER__) 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker // Similar scoped histogram timer, but this uses ANGLE_HISTOGRAM_LONG_TIMES_100, 73*8975f5c5SAndroid Build Coastguard Worker // which measures up to an hour, and uses 100 buckets. This is more expensive 74*8975f5c5SAndroid Build Coastguard Worker // to store, so only use if this often takes >10 seconds. 75*8975f5c5SAndroid Build Coastguard Worker #define SCOPED_ANGLE_HISTOGRAM_LONG_TIMER(name) \ 76*8975f5c5SAndroid Build Coastguard Worker SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, true, __COUNTER__) 77*8975f5c5SAndroid Build Coastguard Worker 78*8975f5c5SAndroid Build Coastguard Worker // This nested macro is necessary to expand __COUNTER__ to an actual value. 79*8975f5c5SAndroid Build Coastguard Worker #define SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, is_long, key) \ 80*8975f5c5SAndroid Build Coastguard Worker SCOPED_ANGLE_HISTOGRAM_TIMER_UNIQUE(name, is_long, key) 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker #define SCOPED_ANGLE_HISTOGRAM_TIMER_UNIQUE(name, is_long, key) \ 83*8975f5c5SAndroid Build Coastguard Worker class [[nodiscard]] ScopedHistogramTimer##key \ 84*8975f5c5SAndroid Build Coastguard Worker { \ 85*8975f5c5SAndroid Build Coastguard Worker public: \ 86*8975f5c5SAndroid Build Coastguard Worker ScopedHistogramTimer##key() \ 87*8975f5c5SAndroid Build Coastguard Worker : constructed_(ANGLEPlatformCurrent()->currentTime(ANGLEPlatformCurrent())) \ 88*8975f5c5SAndroid Build Coastguard Worker {} \ 89*8975f5c5SAndroid Build Coastguard Worker ~ScopedHistogramTimer##key() \ 90*8975f5c5SAndroid Build Coastguard Worker { \ 91*8975f5c5SAndroid Build Coastguard Worker if (constructed_ == 0) \ 92*8975f5c5SAndroid Build Coastguard Worker return; \ 93*8975f5c5SAndroid Build Coastguard Worker auto *platform = ANGLEPlatformCurrent(); \ 94*8975f5c5SAndroid Build Coastguard Worker double elapsed = platform->currentTime(platform) - constructed_; \ 95*8975f5c5SAndroid Build Coastguard Worker int elapsedMS = static_cast<int>(elapsed * 1000.0); \ 96*8975f5c5SAndroid Build Coastguard Worker if (is_long) \ 97*8975f5c5SAndroid Build Coastguard Worker { \ 98*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_LONG_TIMES_100(name, elapsedMS); \ 99*8975f5c5SAndroid Build Coastguard Worker } \ 100*8975f5c5SAndroid Build Coastguard Worker else \ 101*8975f5c5SAndroid Build Coastguard Worker { \ 102*8975f5c5SAndroid Build Coastguard Worker ANGLE_HISTOGRAM_TIMES(name, elapsedMS); \ 103*8975f5c5SAndroid Build Coastguard Worker } \ 104*8975f5c5SAndroid Build Coastguard Worker } \ 105*8975f5c5SAndroid Build Coastguard Worker \ 106*8975f5c5SAndroid Build Coastguard Worker private: \ 107*8975f5c5SAndroid Build Coastguard Worker double constructed_; \ 108*8975f5c5SAndroid Build Coastguard Worker } scoped_histogram_timer_##key 109*8975f5c5SAndroid Build Coastguard Worker 110*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_HISTOGRAM_MACROS_H_ 111