ReportPerformance.cpp revision 6ad40ee051e75ed3d986327e9967cf493047148d
180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager/* 280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * Copyright (C) 2017 The Android Open Source Project 380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * 480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * Licensed under the Apache License, Version 2.0 (the "License"); 580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * you may not use this file except in compliance with the License. 680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * You may obtain a copy of the License at 780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * 880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * http://www.apache.org/licenses/LICENSE-2.0 980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * 1080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * Unless required by applicable law or agreed to in writing, software 1180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * distributed under the License is distributed on an "AS IS" BASIS, 1280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * See the License for the specific language governing permissions and 1480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * limitations under the License. 1580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager */ 1680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 1780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#define LOG_TAG "ReportPerformance" 1880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 1980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <fstream> 2080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <iostream> 2180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <queue> 2280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <stdarg.h> 2380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <stdint.h> 2480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <stdio.h> 2580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <string.h> 2623f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager#include <sstream> 2780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <sys/prctl.h> 2880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <utility> 2980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <media/nbaio/NBLog.h> 3080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <media/nbaio/PerformanceAnalysis.h> 3180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <media/nbaio/ReportPerformance.h> 3280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <utils/Log.h> 3380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <utils/String8.h> 3480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 3580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wagernamespace android { 3680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 3780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wagernamespace ReportPerformance { 3880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 3980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager// Writes outlier intervals, timestamps, and histograms spanning long time intervals to a file. 4080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager// TODO: format the data efficiently and write different types of data to different files 41f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wagervoid writeToFile(const std::deque<std::pair<timestamp, Histogram>> &hists, 426ad40ee051e75ed3d986327e9967cf493047148dSanna Catherine de Treville Wager const std::deque<std::pair<msInterval, timestamp>> &outlierData, 43f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager const std::deque<timestamp> &peakTimestamps, 44f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager const char * directory, bool append, int author, log_hash_t hash) { 4580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager if (outlierData.empty() || hists.empty()) { 4623f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager ALOGW("No data, returning."); 4780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager return; 4880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager } 4980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 5023f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager std::stringstream outlierName; 5123f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager std::stringstream histogramName; 52f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager std::stringstream peakName; 5323f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager 54f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager histogramName << directory << "histograms_" << author << "_" << hash; 55f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager outlierName << directory << "outliers_" << author << "_" << hash; 56f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager peakName << directory << "peaks_" << author << "_" << hash; 5723f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager 5823f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager std::ofstream hfs; 59f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager hfs.open(histogramName.str(), append ? std::ios::app : std::ios::trunc); 6023f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager if (!hfs.is_open()) { 6123f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager ALOGW("couldn't open file %s", histogramName.str().c_str()); 6223f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager return; 6323f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager } 6423f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager hfs << "Histogram data\n"; 6580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager for (const auto &hist : hists) { 6623f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager hfs << "\ttimestamp\n"; 6723f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager hfs << hist.first << "\n"; 686ad40ee051e75ed3d986327e9967cf493047148dSanna Catherine de Treville Wager hfs << "\tbuckets (in ms) and counts\n"; 6980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager for (const auto &bucket : hist.second) { 706ad40ee051e75ed3d986327e9967cf493047148dSanna Catherine de Treville Wager hfs << bucket.first / static_cast<double>(kJiffyPerMs) 716ad40ee051e75ed3d986327e9967cf493047148dSanna Catherine de Treville Wager << ": " << bucket.second << "\n"; 7280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager } 7323f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager hfs << "\n"; // separate histograms with a newline 7480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager } 7523f89d3469e5f4de4072bbd305e9552483abe723Sanna Catherine de Treville Wager hfs.close(); 76f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager 77f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager std::ofstream ofs; 78f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager ofs.open(outlierName.str(), append ? std::ios::app : std::ios::trunc); 79f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager if (!ofs.is_open()) { 80f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager ALOGW("couldn't open file %s", outlierName.str().c_str()); 81f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager return; 82f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager } 83f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager ofs << "Outlier data: interval and timestamp\n"; 84f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager for (const auto &outlier : outlierData) { 85f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager ofs << outlier.first << ": " << outlier.second << "\n"; 86f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager } 87f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager ofs.close(); 88f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager 89f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager std::ofstream pfs; 90f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager pfs.open(peakName.str(), append ? std::ios::app : std::ios::trunc); 91f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager if (!pfs.is_open()) { 92f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager ALOGW("couldn't open file %s", peakName.str().c_str()); 93f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager return; 94f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager } 95f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager pfs << "Peak data: timestamp\n"; 96f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager for (const auto &peak : peakTimestamps) { 97f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager pfs << peak << "\n"; 98f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager } 99f8c34284fcc9b5d64af3199c33cc1cec70a460e2Sanna Catherine de Treville Wager pfs.close(); 10080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager} 10180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 10280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager} // namespace ReportPerformance 10380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 10480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager} // namespace android 105