1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <thread>
17 #include <iostream>
18 #include <fstream>
19 #include <string>
20 #include <cstring>
21 #include <vector>
22 #include <cstdio>
23 #include <sstream>
24 #include <iomanip>
25 #include <regex>
26 #include <cmath>
27 #include "include/parse_radar.h"
28 #include "include/sp_log.h"
29 namespace OHOS {
30 namespace SmartPerf {
ParseRadarStart(const std::string &string) const31 double ParseRadar::ParseRadarStart(const std::string &string) const
32 {
33 double time = -1;
34 std::string target = "\"E2E_LATENCY\":";
35 time = std::stod(ExtractString(string, target));
36 return time;
37 }
ParseRadarStartResponse(const std::string &string) const38 double ParseRadar::ParseRadarStartResponse(const std::string &string) const
39 {
40 double time = -1;
41 std::string target = "\"RESPONSE_LATENCY\":";
42 time = std::stod(ExtractString(string, target));
43 return time;
44 }
ParseRadarAppStrart(const std::string &string) const45 std::string ParseRadar::ParseRadarAppStrart(const std::string &string) const
46 {
47 std::ostringstream stream;
48 std::ostringstream streamComplete;
49 std::string animationCompleteTime = ExtractString(string, "\"ANIMATION_LATENCY\":");
50 double completeTime = ParseRadarDelayTime(string, targetComplete, delayTimeComplete);
51 streamComplete << completeTime;
52 double responseTime = ParseRadarDelayTime(string, targetResponse, delayTimeResponse);
53 stream << responseTime;
54 std::string firstFrameDrawnTime = ExtractString(string, "\"FIRST_FRAEM_DRAWN_LATENCY\":");
55 std::string result = "ResponseTime:" + stream.str() +
56 "ms\n"
57 "FirstFrameDrawnTime:" +
58 firstFrameDrawnTime +
59 "ms\n"
60 "AnimationCompleteTime:" +
61 animationCompleteTime +
62 "ms\n"
63 "CompleteTime:" +
64 streamComplete.str() + "ms\n";
65 LOGI("Radar.result====: %s", result.c_str());
66 return result;
67 }
ParseRadarResponse(const std::string &string) const68 double ParseRadar::ParseRadarResponse(const std::string &string) const
69 {
70 double time = -1;
71 time = ParseRadarDelayTime(string, targetResponse, delayTimeResponse);
72 return time;
73 }
74
ParseRadarDelayTime(const std::string &string, const std::string &target, const int &delayTime) const75 double ParseRadar::ParseRadarDelayTime(const std::string &string, const std::string &target, const int &delayTime) const
76 {
77 std::stringstream ss(string);
78 std::string segment;
79 int maxDelayTime = -1;
80 std::vector<std::string> delayTimeVec;
81 while (getline(ss, segment, '}')) {
82 if (segment.empty()) {
83 continue;
84 }
85 std::string segments = segment.substr(1);
86 std::stringstream ss2(segments);
87 std::string pair;
88 while (getline(ss2, pair, ',')) {
89 std::string key = pair.substr(0, pair.find(':'));
90 std::string value = pair.substr(pair.find(':') + 1);
91 if (key == target) {
92 delayTimeVec.push_back(value);
93 maxDelayTime = GetMaxDelayTime(delayTime, delayTimeVec);
94 }
95 }
96 }
97 return static_cast<double>(maxDelayTime);
98 }
GetMaxDelayTime(const int &delayTime, std::vector<std::string> &delayTimeVec) const99 int ParseRadar::GetMaxDelayTime(const int &delayTime, std::vector<std::string> &delayTimeVec) const
100 {
101 int maxNum = -1;
102 for (size_t i = 0; i < delayTimeVec.size(); i++) {
103 int num = std::stoi(delayTimeVec[i]);
104 if (num < delayTime && num > maxNum) {
105 maxNum = num;
106 }
107 }
108 return maxNum;
109 }
ParseRadarComplete(const std::string &string) const110 double ParseRadar::ParseRadarComplete(const std::string &string) const
111 {
112 double time = -1;
113 time = ParseRadarDelayTime(string, targetComplete, delayTimeComplete);
114 return time;
115 }
ParseRadarMaxFrame(const std::string &string) const116 std::string ParseRadar::ParseRadarMaxFrame(const std::string &string) const
117 {
118 std::string maxRenderSeqMissedFrames = ExtractString(string, "\"MAX_RENDER_SEQ_MISSED_FRAMES\":");
119 std::string result = "MAX_RENDER_SEQ_MISSED_FRAMES:" + maxRenderSeqMissedFrames;
120 return result;
121 }
ParseRadarFrame(const std::string &string) const122 std::string ParseRadar::ParseRadarFrame(const std::string &string) const
123 {
124 std::string budleName = ExtractString(string, "\"BUNDLE_NAME_EX\":");
125 std::cout << "BUNDLE_NAME:" << budleName << std::endl;
126 std::string sceneId = ExtractString(string, "\"SCENE_ID\":");
127 std::cout << "SCENE_ID:" << sceneId << std::endl;
128 std::string totalAppFrames = ExtractString(string, "\"TOTAL_APP_FRAMES\":");
129 std::cout << "TOTAL_APP_FRAMES:" << totalAppFrames << std::endl;
130 std::string totalAppMissedFrames = ExtractString(string, "\"TOTAL_APP_MISSED_FRAMES\":");
131 std::cout << "TOTAL_APP_MISSED_FRAMES:" << totalAppMissedFrames << std::endl;
132 std::string maxAppFramsestime = ExtractString(string, "\"MAX_APP_FRAMETIME\":");
133 std::cout << "MAX_APP_FRAMETIME:" << maxAppFramsestime << "ms" << std::endl;
134 std::string maxAppSeqMissedFrames = ExtractString(string, "\"MAX_APP_SEQ_MISSED_FRAMES\":");
135 std::cout << "MAX_APP_SEQ_MISSED_FRAMES:" << maxAppSeqMissedFrames << std::endl;
136 std::string totalRenderFrames = ExtractString(string, "\"TOTAL_RENDER_FRAMES\":");
137 std::cout << "TOTAL_RENDER_FRAMES:" << totalRenderFrames << std::endl;
138 std::string totalRenderMissedFrames = ExtractString(string, "\"TOTAL_RENDER_MISSED_FRAMES\":");
139 std::cout << "TOTAL_RENDER_MISSED_FRAMES:" << totalRenderMissedFrames << std::endl;
140 std::string maxRenderFrametime = ExtractString(string, "\"MAX_RENDER_FRAMETIME\":");
141 std::cout << "MAX_RENDER_FRAMETIME:" << maxRenderFrametime << "ms" << std::endl;
142 std::string averageRenderFrametime = ExtractString(string, "\"AVERAGE_RENDER_FRAMETIME\":");
143 std::cout << "AVERAGE_RENDER_FRAMETIME:" << averageRenderFrametime << "ms" << std::endl;
144 std::string maxRenderSeqMissedFrames = ExtractString(string, "\"MAX_RENDER_SEQ_MISSED_FRAMES\":");
145 std::cout << "MAX_RENDER_SEQ_MISSED_FRAMES:" << maxRenderSeqMissedFrames << std::endl;
146 std::string result = "";
147 return result;
148 }
ExtractString(const std::string &str, const std::string &target) const149 std::string ParseRadar::ExtractString(const std::string &str, const std::string &target) const
150 {
151 LOGI("Radar.str: %s", str.c_str());
152 size_t pos = str.find(target);
153 if (pos != std::string::npos) {
154 pos += target.length();
155 size_t commaPos = str.find(",", pos);
156 if (commaPos != std::string::npos) {
157 std::string result = str.substr(pos, commaPos - pos);
158 return result;
159 }
160 }
161
162 return "-1";
163 }
164 }
165 }