• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "include/sp_utils.h"
30 namespace OHOS {
31 namespace SmartPerf {
ParseRadarStart(const std::string & string) const32 double ParseRadar::ParseRadarStart(const std::string &string) const
33 {
34     double time = -1;
35     std::string target = "\"E2E_LATENCY\":";
36     time = SPUtilesTye::StringToSometype<double>(ExtractString(string, target));
37     return time;
38 }
ParseRadarStartResponse(const std::string & string) const39 double ParseRadar::ParseRadarStartResponse(const std::string &string) const
40 {
41     double time = -1;
42     std::string target = "\"RESPONSE_LATENCY\":";
43     time = SPUtilesTye::StringToSometype<double>(ExtractString(string, target));
44     return time;
45 }
ParseRadarAppStrart(const std::string & string) const46 std::string ParseRadar::ParseRadarAppStrart(const std::string &string) const
47 {
48     std::ostringstream stream;
49     std::ostringstream streamComplete;
50     std::string animationCompleteTime = ExtractString(string, "\"ANIMATION_LATENCY\":");
51     double completeTime = ParseRadarDelayTime(string, targetComplete, delayTimeComplete);
52     streamComplete << completeTime;
53     double responseTime = ParseRadarDelayTime(string, targetResponse, delayTimeResponse);
54     stream << responseTime;
55     std::string firstFrameDrawnTime = ExtractString(string, "\"FIRST_FRAEM_DRAWN_LATENCY\":");
56     std::string result = "ResponseTime:" + stream.str() +
57         "ms\n"
58         "FirstFrameDrawnTime:" +
59         firstFrameDrawnTime +
60         "ms\n"
61         "AnimationCompleteTime:" +
62         animationCompleteTime +
63         "ms\n"
64         "CompleteTime:" +
65         streamComplete.str() + "ms\n";
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 = SPUtilesTye::StringToSometype<int>(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     size_t pos = str.find(target);
152     if (pos != std::string::npos) {
153         pos += target.length();
154         size_t commaPos = str.find(",", pos);
155         if (commaPos != std::string::npos) {
156             std::string result = str.substr(pos, commaPos - pos);
157             return result;
158         }
159     }
160 
161     return "-1";
162 }
163 }
164 }