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