106f6ba60Sopenharmony_ci/* 206f6ba60Sopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. 306f6ba60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 406f6ba60Sopenharmony_ci * you may not use this file except in compliance with the License. 506f6ba60Sopenharmony_ci * You may obtain a copy of the License at 606f6ba60Sopenharmony_ci * 706f6ba60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 806f6ba60Sopenharmony_ci * 906f6ba60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1006f6ba60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1106f6ba60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1206f6ba60Sopenharmony_ci * See the License for the specific language governing permissions and 1306f6ba60Sopenharmony_ci * limitations under the License. 1406f6ba60Sopenharmony_ci */ 1506f6ba60Sopenharmony_ci#include <fstream> 1606f6ba60Sopenharmony_ci#include <string> 1706f6ba60Sopenharmony_ci#include <iostream> 1806f6ba60Sopenharmony_ci#include <regex> 1906f6ba60Sopenharmony_ci#include <cmath> 2006f6ba60Sopenharmony_ci#include "include/stalling_rate_trace.h" 2106f6ba60Sopenharmony_ci#include "include/sp_log.h" 2206f6ba60Sopenharmony_ci 2306f6ba60Sopenharmony_cinamespace OHOS { 2406f6ba60Sopenharmony_cinamespace SmartPerf { 2506f6ba60Sopenharmony_cidouble StallingRateTrace::StallingRateResult(std::string file) 2606f6ba60Sopenharmony_ci{ 2706f6ba60Sopenharmony_ci double stalligRate = 0; 2806f6ba60Sopenharmony_ci char realPath[PATH_MAX] = {0x00}; 2906f6ba60Sopenharmony_ci if ((realpath(file.c_str(), realPath) == nullptr)) { 3006f6ba60Sopenharmony_ci std::cout << "" << std::endl; 3106f6ba60Sopenharmony_ci } 3206f6ba60Sopenharmony_ci infile.open(realPath); 3306f6ba60Sopenharmony_ci if (infile.fail()) { 3406f6ba60Sopenharmony_ci LOGI("StallingRateTrace open file(%s) fialed ", file.c_str()); 3506f6ba60Sopenharmony_ci return stalligRate; 3606f6ba60Sopenharmony_ci } 3706f6ba60Sopenharmony_ci stalligRate = SmartPerf::StallingRateTrace::CalculateTime(); 3806f6ba60Sopenharmony_ci infile.close(); 3906f6ba60Sopenharmony_ci return stalligRate; 4006f6ba60Sopenharmony_ci} 4106f6ba60Sopenharmony_ci 4206f6ba60Sopenharmony_cidouble StallingRateTrace::CalculateTime() 4306f6ba60Sopenharmony_ci{ 4406f6ba60Sopenharmony_ci frameLossRate = 0; 4506f6ba60Sopenharmony_ci frameLossTime = 0; 4606f6ba60Sopenharmony_ci swiperFrameLossRate = 0; 4706f6ba60Sopenharmony_ci appFrameLossRate = 0; 4806f6ba60Sopenharmony_ci tabsFrameLossRate = 0; 4906f6ba60Sopenharmony_ci frameLossSwiperTime = 0; 5006f6ba60Sopenharmony_ci frameLossTabsTime = 0; 5106f6ba60Sopenharmony_ci std::string signS = "S|"; 5206f6ba60Sopenharmony_ci std::string signF = "F|"; 5306f6ba60Sopenharmony_ci std::string line; 5406f6ba60Sopenharmony_ci while (getline(infile, line)) { 5506f6ba60Sopenharmony_ci AppList(line, signS, signF); 5606f6ba60Sopenharmony_ci AppSwiperScroll(line, signS, signF); 5706f6ba60Sopenharmony_ci APPTabs(line, signS, signF); 5806f6ba60Sopenharmony_ci } 5906f6ba60Sopenharmony_ci CalcFrameRate(); 6006f6ba60Sopenharmony_ci JudgFrameRate(); 6106f6ba60Sopenharmony_ci MultiLaneFrameRate(); 6206f6ba60Sopenharmony_ci return frameLossRate; 6306f6ba60Sopenharmony_ci} 6406f6ba60Sopenharmony_ci 6506f6ba60Sopenharmony_civoid StallingRateTrace::CalcFrameRate() 6606f6ba60Sopenharmony_ci{ 6706f6ba60Sopenharmony_ci if (appListDynamicStartTime != 0 && appListDynamicFinishTime != 0) { 6806f6ba60Sopenharmony_ci appFrameLossRate = (frameLossTime / (appListDynamicFinishTime - appListDynamicStartTime) * oneThousand); 6906f6ba60Sopenharmony_ci } else { 7006f6ba60Sopenharmony_ci appFrameLossRate = -1; 7106f6ba60Sopenharmony_ci } 7206f6ba60Sopenharmony_ci LOGI("result.appFrameLossRate: (%s)", std::to_string(appFrameLossRate).c_str()); 7306f6ba60Sopenharmony_ci 7406f6ba60Sopenharmony_ci if (swiperDynamicFinishTime != 0 && swiperDynamicStartTime != 0) { 7506f6ba60Sopenharmony_ci swiperFrameLossRate = (frameLossSwiperTime / (swiperDynamicFinishTime - swiperDynamicStartTime) * oneThousand); 7606f6ba60Sopenharmony_ci } else { 7706f6ba60Sopenharmony_ci swiperFrameLossRate = -1; 7806f6ba60Sopenharmony_ci } 7906f6ba60Sopenharmony_ci LOGI("result.swiperFrameLossRate: (%s)", std::to_string(swiperFrameLossRate).c_str()); 8006f6ba60Sopenharmony_ci 8106f6ba60Sopenharmony_ci if (appTabsDynamicStartTime != 0 && appTabsDynamicFinishTime != 0) { 8206f6ba60Sopenharmony_ci tabsFrameLossRate = (frameLossTabsTime / (appTabsDynamicFinishTime - appTabsDynamicStartTime) * oneThousand); 8306f6ba60Sopenharmony_ci } else { 8406f6ba60Sopenharmony_ci tabsFrameLossRate = -1; 8506f6ba60Sopenharmony_ci } 8606f6ba60Sopenharmony_ci LOGI("result.tabsFrameLossRate: (%s)", std::to_string(tabsFrameLossRate).c_str()); 8706f6ba60Sopenharmony_ci} 8806f6ba60Sopenharmony_ci 8906f6ba60Sopenharmony_civoid StallingRateTrace::JudgFrameRate() 9006f6ba60Sopenharmony_ci{ 9106f6ba60Sopenharmony_ci auto hasDynamic = [](bool finishTime, bool startTime) { 9206f6ba60Sopenharmony_ci return finishTime != 0 || startTime != 0; 9306f6ba60Sopenharmony_ci }; 9406f6ba60Sopenharmony_ci 9506f6ba60Sopenharmony_ci bool appListDynamicExists = hasDynamic(appListDynamicFinishTime, appListDynamicStartTime); 9606f6ba60Sopenharmony_ci bool swiperDynamicExists = hasDynamic(swiperDynamicFinishTime, swiperDynamicStartTime); 9706f6ba60Sopenharmony_ci bool tabsDynamicExists = hasDynamic(appTabsDynamicFinishTime, appTabsDynamicStartTime); 9806f6ba60Sopenharmony_ci 9906f6ba60Sopenharmony_ci if (!appListDynamicExists) { 10006f6ba60Sopenharmony_ci LOGI("no app list Dynamic"); 10106f6ba60Sopenharmony_ci frameLossRate = swiperDynamicExists ? swiperFrameLossRate : 10206f6ba60Sopenharmony_ci tabsDynamicExists ? tabsFrameLossRate : -1; 10306f6ba60Sopenharmony_ci } else if (!swiperDynamicExists) { 10406f6ba60Sopenharmony_ci LOGI("no swiper Dynamic"); 10506f6ba60Sopenharmony_ci frameLossRate = appListDynamicExists ? appFrameLossRate : 10606f6ba60Sopenharmony_ci tabsDynamicExists ? tabsFrameLossRate : -1; 10706f6ba60Sopenharmony_ci } else if (!tabsDynamicExists) { 10806f6ba60Sopenharmony_ci LOGI("no tabs Dynamic"); 10906f6ba60Sopenharmony_ci frameLossRate = appListDynamicExists ? appFrameLossRate : 11006f6ba60Sopenharmony_ci swiperDynamicExists ? swiperFrameLossRate : -1; 11106f6ba60Sopenharmony_ci } else { 11206f6ba60Sopenharmony_ci frameLossRate = -1; 11306f6ba60Sopenharmony_ci } 11406f6ba60Sopenharmony_ci} 11506f6ba60Sopenharmony_ci 11606f6ba60Sopenharmony_civoid StallingRateTrace::MultiLaneFrameRate() 11706f6ba60Sopenharmony_ci{ 11806f6ba60Sopenharmony_ci if (appFrameLossRate == 0) { 11906f6ba60Sopenharmony_ci LOGI("no app list hitchTime"); 12006f6ba60Sopenharmony_ci if (swiperFrameLossRate > 0) { 12106f6ba60Sopenharmony_ci frameLossRate = swiperFrameLossRate; 12206f6ba60Sopenharmony_ci } else if (tabsFrameLossRate > 0) { 12306f6ba60Sopenharmony_ci frameLossRate = tabsFrameLossRate; 12406f6ba60Sopenharmony_ci } else { 12506f6ba60Sopenharmony_ci frameLossRate = 0; 12606f6ba60Sopenharmony_ci } 12706f6ba60Sopenharmony_ci } else if (swiperFrameLossRate == 0) { 12806f6ba60Sopenharmony_ci LOGI("no swiper list hitchTime"); 12906f6ba60Sopenharmony_ci if (appFrameLossRate > 0) { 13006f6ba60Sopenharmony_ci frameLossRate = appFrameLossRate; 13106f6ba60Sopenharmony_ci } else if (tabsFrameLossRate > 0) { 13206f6ba60Sopenharmony_ci frameLossRate = tabsFrameLossRate; 13306f6ba60Sopenharmony_ci } else { 13406f6ba60Sopenharmony_ci frameLossRate = 0; 13506f6ba60Sopenharmony_ci } 13606f6ba60Sopenharmony_ci } else if (tabsFrameLossRate == 0) { 13706f6ba60Sopenharmony_ci LOGI("no tabs list hitchTime"); 13806f6ba60Sopenharmony_ci if (appFrameLossRate > 0) { 13906f6ba60Sopenharmony_ci frameLossRate = appFrameLossRate; 14006f6ba60Sopenharmony_ci } else if (swiperFrameLossRate > 0) { 14106f6ba60Sopenharmony_ci frameLossRate = swiperFrameLossRate; 14206f6ba60Sopenharmony_ci } 14306f6ba60Sopenharmony_ci } 14406f6ba60Sopenharmony_ci AddMultiLaneFrameRate(); 14506f6ba60Sopenharmony_ci} 14606f6ba60Sopenharmony_ci 14706f6ba60Sopenharmony_civoid StallingRateTrace::AddMultiLaneFrameRate() 14806f6ba60Sopenharmony_ci{ 14906f6ba60Sopenharmony_ci if (appFrameLossRate > 0 && swiperFrameLossRate > 0) { 15006f6ba60Sopenharmony_ci //app and swiper hitchTime 1 15106f6ba60Sopenharmony_ci if (appListDynamicStartTime < swiperDynamicStartTime) { 15206f6ba60Sopenharmony_ci frameLossRate = appFrameLossRate; 15306f6ba60Sopenharmony_ci } else { 15406f6ba60Sopenharmony_ci frameLossRate = swiperFrameLossRate; 15506f6ba60Sopenharmony_ci } 15606f6ba60Sopenharmony_ci } else if (appFrameLossRate > 0 && tabsFrameLossRate > 0) { 15706f6ba60Sopenharmony_ci //app and tabs hitchTime 2 15806f6ba60Sopenharmony_ci if (appListDynamicStartTime < appTabsDynamicStartTime) { 15906f6ba60Sopenharmony_ci frameLossRate = appFrameLossRate; 16006f6ba60Sopenharmony_ci } else { 16106f6ba60Sopenharmony_ci frameLossRate = appTabsDynamicStartTime; 16206f6ba60Sopenharmony_ci } 16306f6ba60Sopenharmony_ci } else if (tabsFrameLossRate > 0 && swiperFrameLossRate > 0) { 16406f6ba60Sopenharmony_ci //tabs and swiper hitchTime 3 16506f6ba60Sopenharmony_ci if (appTabsDynamicStartTime < swiperDynamicStartTime) { 16606f6ba60Sopenharmony_ci frameLossRate = tabsFrameLossRate; 16706f6ba60Sopenharmony_ci } else { 16806f6ba60Sopenharmony_ci frameLossRate = swiperFrameLossRate; 16906f6ba60Sopenharmony_ci } 17006f6ba60Sopenharmony_ci } 17106f6ba60Sopenharmony_ci} 17206f6ba60Sopenharmony_ci 17306f6ba60Sopenharmony_ci 17406f6ba60Sopenharmony_civoid StallingRateTrace::AppList(const std::string &line, const std::string &signS, const std::string &signF) 17506f6ba60Sopenharmony_ci{ 17606f6ba60Sopenharmony_ci if (line.find("H:LAUNCHER_APP_LAUNCH_FROM_ICON,") != std::string::npos || 17706f6ba60Sopenharmony_ci line.find("H:APP_LIST_FLING,") != std::string::npos || 17806f6ba60Sopenharmony_ci line.find("H:WEB_LIST_FLING") != std::string::npos || 17906f6ba60Sopenharmony_ci line.find("H:ABILITY_OR_PAGE_SWITCH,") != std::string::npos || 18006f6ba60Sopenharmony_ci line.find("H:APP_TRANSITION_TO_OTHER_APP,") != std::string::npos || 18106f6ba60Sopenharmony_ci line.find("H:LAUNCHER_APP_LAUNCH_FROM_DOCK,") != std::string::npos || 18206f6ba60Sopenharmony_ci line.find("H:LAUNCHER_APP_LAUNCH_FROM_APPCENTER,") != std::string::npos) { 18306f6ba60Sopenharmony_ci if (listFlag) { 18406f6ba60Sopenharmony_ci LOGI("AppList line start: (%s)", line.c_str()); 18506f6ba60Sopenharmony_ci appListDynamicFinishTime = GetTimes(line, signF); 18606f6ba60Sopenharmony_ci LOGI("appListDynamicFinishTime: (%s)", std::to_string(appListDynamicFinishTime).c_str()); 18706f6ba60Sopenharmony_ci listFlag = false; 18806f6ba60Sopenharmony_ci } else { 18906f6ba60Sopenharmony_ci LOGI("AppList line finish: (%s)", line.c_str()); 19006f6ba60Sopenharmony_ci appListDynamicStartTime = GetTimes(line, signS); 19106f6ba60Sopenharmony_ci LOGI("appListDynamicStartTime: (%s)", std::to_string(appListDynamicStartTime).c_str()); 19206f6ba60Sopenharmony_ci listFlag = true; 19306f6ba60Sopenharmony_ci frameLossTime = 0; 19406f6ba60Sopenharmony_ci } 19506f6ba60Sopenharmony_ci } 19606f6ba60Sopenharmony_ci if (listFlag) { 19706f6ba60Sopenharmony_ci GetRsHardWareRate(nowFrameRate, line, SWIM_APPLIST); 19806f6ba60Sopenharmony_ci if (upperScreenFlag) { 19906f6ba60Sopenharmony_ci if (line.find("|H:Present Fence ") != std::string::npos) { 20006f6ba60Sopenharmony_ci fenceId = GetFenceId(line); 20106f6ba60Sopenharmony_ci LOGI("fenceId: (%d)", fenceId); 20206f6ba60Sopenharmony_ci } 20306f6ba60Sopenharmony_ci std::string waitFenceId = "|H:Waiting for Present Fence " + std::to_string(fenceId); 20406f6ba60Sopenharmony_ci if (line.find(waitFenceId) != std::string::npos) { 20506f6ba60Sopenharmony_ci nowTime = std::stod(SmartPerf::StallingRateTrace::GetOnScreenTimeStart(line)); 20606f6ba60Sopenharmony_ci GetFrameLossTime(nowTime, lastTime, roundTime, frameLossTime); 20706f6ba60Sopenharmony_ci LOGI("frameLossTime: (%s)", std::to_string(frameLossTime).c_str()); 20806f6ba60Sopenharmony_ci lastTime = nowTime; 20906f6ba60Sopenharmony_ci upperScreenFlag = false; 21006f6ba60Sopenharmony_ci } 21106f6ba60Sopenharmony_ci } 21206f6ba60Sopenharmony_ci } 21306f6ba60Sopenharmony_ci} 21406f6ba60Sopenharmony_ci 21506f6ba60Sopenharmony_civoid StallingRateTrace::GetFrameLossTime(double curTime, double prevTime, double drawTime, double &totalFrameLossTime) 21606f6ba60Sopenharmony_ci{ 21706f6ba60Sopenharmony_ci if ((curTime - prevTime) > drawTime && prevTime != 0) { 21806f6ba60Sopenharmony_ci double diffTime = (curTime - prevTime) - drawTime; 21906f6ba60Sopenharmony_ci LOGI("diffTime: (%s)", std::to_string(diffTime).c_str()); 22006f6ba60Sopenharmony_ci totalFrameLossTime += diffTime; 22106f6ba60Sopenharmony_ci LOGI("totalFrameLossTime: (%s)", std::to_string(totalFrameLossTime).c_str()); 22206f6ba60Sopenharmony_ci } 22306f6ba60Sopenharmony_ci} 22406f6ba60Sopenharmony_ci 22506f6ba60Sopenharmony_civoid StallingRateTrace::GetRsHardWareRate(double curFrameRate, const std::string &line, SWIM_TYPE type) 22606f6ba60Sopenharmony_ci{ 22706f6ba60Sopenharmony_ci if (line.find("H:RSHardwareThread::CommitAndReleaseLayers") != std::string::npos) { 22806f6ba60Sopenharmony_ci switch (type) { 22906f6ba60Sopenharmony_ci case SWIM_APPLIST: 23006f6ba60Sopenharmony_ci upperScreenFlag = true; 23106f6ba60Sopenharmony_ci break; 23206f6ba60Sopenharmony_ci case SWIM_APPSWIPER: 23306f6ba60Sopenharmony_ci upperScreenSwiperFlag = true; 23406f6ba60Sopenharmony_ci break; 23506f6ba60Sopenharmony_ci case SWIM_APPTABS: 23606f6ba60Sopenharmony_ci upperScreenTabsFlag = true; 23706f6ba60Sopenharmony_ci break; 23806f6ba60Sopenharmony_ci default: 23906f6ba60Sopenharmony_ci break; 24006f6ba60Sopenharmony_ci } 24106f6ba60Sopenharmony_ci curFrameRate = GetFrameRate(line); 24206f6ba60Sopenharmony_ci LOGI("curFrameRate1: (%s)", std::to_string(curFrameRate).c_str()); 24306f6ba60Sopenharmony_ci if (curFrameRate != 0) { 24406f6ba60Sopenharmony_ci UpdateRoundTime(curFrameRate, type); 24506f6ba60Sopenharmony_ci } 24606f6ba60Sopenharmony_ci } else if (line.find("H:RSHardwareThread::PerformSetActiveMode setting active mode") != std::string::npos) { 24706f6ba60Sopenharmony_ci switch (type) { 24806f6ba60Sopenharmony_ci case SWIM_APPLIST: 24906f6ba60Sopenharmony_ci upperScreenFlag = true; 25006f6ba60Sopenharmony_ci break; 25106f6ba60Sopenharmony_ci case SWIM_APPSWIPER: 25206f6ba60Sopenharmony_ci upperScreenSwiperFlag = true; 25306f6ba60Sopenharmony_ci break; 25406f6ba60Sopenharmony_ci case SWIM_APPTABS: 25506f6ba60Sopenharmony_ci upperScreenTabsFlag = true; 25606f6ba60Sopenharmony_ci break; 25706f6ba60Sopenharmony_ci default: 25806f6ba60Sopenharmony_ci break; 25906f6ba60Sopenharmony_ci } 26006f6ba60Sopenharmony_ci curFrameRate = GetFrameRate(line); 26106f6ba60Sopenharmony_ci LOGI("curFrameRate2: (%s)", std::to_string(curFrameRate).c_str()); 26206f6ba60Sopenharmony_ci if (curFrameRate != 0) { 26306f6ba60Sopenharmony_ci UpdateRoundTime(curFrameRate, type); 26406f6ba60Sopenharmony_ci } 26506f6ba60Sopenharmony_ci } 26606f6ba60Sopenharmony_ci} 26706f6ba60Sopenharmony_ci 26806f6ba60Sopenharmony_civoid StallingRateTrace::UpdateRoundTime(double curFrameRate, SWIM_TYPE type) 26906f6ba60Sopenharmony_ci{ 27006f6ba60Sopenharmony_ci const double kadunNum = 1.5; 27106f6ba60Sopenharmony_ci const double num = 1; 27206f6ba60Sopenharmony_ci if (curFrameRate != 0) { 27306f6ba60Sopenharmony_ci switch (type) { 27406f6ba60Sopenharmony_ci case SWIM_APPLIST: 27506f6ba60Sopenharmony_ci roundTime = (num / curFrameRate) * kadunNum; 27606f6ba60Sopenharmony_ci break; 27706f6ba60Sopenharmony_ci case SWIM_APPSWIPER: 27806f6ba60Sopenharmony_ci roundSwiperTime = (num / curFrameRate) * kadunNum; 27906f6ba60Sopenharmony_ci break; 28006f6ba60Sopenharmony_ci case SWIM_APPTABS: 28106f6ba60Sopenharmony_ci roundTabsTime = (num / curFrameRate) * kadunNum; 28206f6ba60Sopenharmony_ci break; 28306f6ba60Sopenharmony_ci default: 28406f6ba60Sopenharmony_ci break; 28506f6ba60Sopenharmony_ci } 28606f6ba60Sopenharmony_ci } 28706f6ba60Sopenharmony_ci} 28806f6ba60Sopenharmony_ci 28906f6ba60Sopenharmony_civoid StallingRateTrace::AppSwiperScroll(const std::string &line, const std::string &signS, const std::string &signF) 29006f6ba60Sopenharmony_ci{ 29106f6ba60Sopenharmony_ci if (line.find("H:APP_SWIPER_NO_ANIMATION_SWITCH") != std::string::npos || 29206f6ba60Sopenharmony_ci line.find("H:APP_SWITCH_FRAME_ANIMATION") != std::string::npos || 29306f6ba60Sopenharmony_ci line.find("H:APP_SWIPER_SCROLL,") != std::string::npos) { 29406f6ba60Sopenharmony_ci if (swiperScrollFlag == 0) { 29506f6ba60Sopenharmony_ci LOGI("AppSwiperScroll line start: (%s)", line.c_str()); 29606f6ba60Sopenharmony_ci swiperDynamicStartTime = GetTimes(line, signS); 29706f6ba60Sopenharmony_ci LOGI("swiperDynamicStartTime: (%s)", std::to_string(swiperDynamicStartTime).c_str()); 29806f6ba60Sopenharmony_ci frameLossSwiperTime = 0; 29906f6ba60Sopenharmony_ci swiperScrollFlag = 1; 30006f6ba60Sopenharmony_ci swiperFlag = true; 30106f6ba60Sopenharmony_ci } 30206f6ba60Sopenharmony_ci } 30306f6ba60Sopenharmony_ci if (line.find("H:APP_SWIPER_FLING,") != std::string::npos || 30406f6ba60Sopenharmony_ci line.find("H:APP_SWIPER_NO_ANIMATION_SWITCH") != std::string::npos || 30506f6ba60Sopenharmony_ci line.find("H:APP_SWITCH_FRAME_ANIMATION") != std::string::npos) { 30606f6ba60Sopenharmony_ci if (swiperFlingFlag == 1) { 30706f6ba60Sopenharmony_ci LOGI("AppSwiper FinishTime line: (%s)", line.c_str()); 30806f6ba60Sopenharmony_ci swiperDynamicFinishTime = GetTimes(line, signF); 30906f6ba60Sopenharmony_ci LOGI("swiperDynamicFinishTime: (%s)", std::to_string(swiperDynamicFinishTime).c_str()); 31006f6ba60Sopenharmony_ci swiperFlag = false; 31106f6ba60Sopenharmony_ci } 31206f6ba60Sopenharmony_ci if (swiperDynamicFinishTime == 0) { 31306f6ba60Sopenharmony_ci swiperFlingFlag = 0; 31406f6ba60Sopenharmony_ci } 31506f6ba60Sopenharmony_ci swiperFlingFlag++; 31606f6ba60Sopenharmony_ci } 31706f6ba60Sopenharmony_ci if (swiperFlag) { 31806f6ba60Sopenharmony_ci GetRsHardWareRate(nowSwiperFrameRate, line, SWIM_APPSWIPER); 31906f6ba60Sopenharmony_ci if (upperScreenSwiperFlag) { 32006f6ba60Sopenharmony_ci if (line.find("|H:Present Fence ") != std::string::npos) { 32106f6ba60Sopenharmony_ci fenceIdSwiper = GetFenceId(line); 32206f6ba60Sopenharmony_ci LOGI("fenceIdSwiper: (%d)", fenceIdSwiper); 32306f6ba60Sopenharmony_ci } 32406f6ba60Sopenharmony_ci std::string waitFenceId = "|H:Waiting for Present Fence " + std::to_string(fenceIdSwiper); 32506f6ba60Sopenharmony_ci if (line.find(waitFenceId) != std::string::npos) { 32606f6ba60Sopenharmony_ci nowSwiperTime = std::stod(SmartPerf::StallingRateTrace::GetOnScreenTimeStart(line)); 32706f6ba60Sopenharmony_ci LOGI("nowSwiperTime: (%s)", std::to_string(nowSwiperTime).c_str()); 32806f6ba60Sopenharmony_ci GetFrameLossTime(nowSwiperTime, lastSwiperTime, roundSwiperTime, frameLossSwiperTime); 32906f6ba60Sopenharmony_ci LOGI("frameLossSwiperTime: (%s)", std::to_string(frameLossSwiperTime).c_str()); 33006f6ba60Sopenharmony_ci lastSwiperTime = nowSwiperTime; 33106f6ba60Sopenharmony_ci upperScreenSwiperFlag = false; 33206f6ba60Sopenharmony_ci } 33306f6ba60Sopenharmony_ci } 33406f6ba60Sopenharmony_ci } 33506f6ba60Sopenharmony_ci} 33606f6ba60Sopenharmony_ci 33706f6ba60Sopenharmony_civoid StallingRateTrace::APPTabs(const std::string &line, const std::string &signS, const std::string &signF) 33806f6ba60Sopenharmony_ci{ 33906f6ba60Sopenharmony_ci static const std::string appTabsNoAnimation = "H:APP_TABS_NO_ANIMATION_SWITCH"; 34006f6ba60Sopenharmony_ci static const std::string appTabsFrameAnimation = "H:APP_TABS_FRAME_ANIMATION"; 34106f6ba60Sopenharmony_ci static const std::string appTabsScroll = "H:APP_TABS_SCROLL,"; 34206f6ba60Sopenharmony_ci 34306f6ba60Sopenharmony_ci if (line.find(appTabsNoAnimation) != std::string::npos || 34406f6ba60Sopenharmony_ci line.find(appTabsFrameAnimation) != std::string::npos || 34506f6ba60Sopenharmony_ci line.find(appTabsScroll) != std::string::npos) { 34606f6ba60Sopenharmony_ci if (tabsFlag) { 34706f6ba60Sopenharmony_ci LOGI("APPTabs line start: (%s)", line.c_str()); 34806f6ba60Sopenharmony_ci appTabsDynamicFinishTime = GetTimes(line, signF); 34906f6ba60Sopenharmony_ci LOGI("appTabsDynamicFinishTime: (%s)", std::to_string(appTabsDynamicFinishTime).c_str()); 35006f6ba60Sopenharmony_ci tabsFlag = false; 35106f6ba60Sopenharmony_ci } else { 35206f6ba60Sopenharmony_ci LOGI("APPTabs line finish: (%s)", line.c_str()); 35306f6ba60Sopenharmony_ci appTabsDynamicStartTime = GetTimes(line, signS); 35406f6ba60Sopenharmony_ci LOGI("appTabsDynamicStartTime: (%s)", std::to_string(appTabsDynamicStartTime).c_str()); 35506f6ba60Sopenharmony_ci tabsFlag = true; 35606f6ba60Sopenharmony_ci frameLossTabsTime = 0; 35706f6ba60Sopenharmony_ci } 35806f6ba60Sopenharmony_ci } 35906f6ba60Sopenharmony_ci if (tabsFlag) { 36006f6ba60Sopenharmony_ci GetRsHardWareRate(nowTabsFrameRate, line, SWIM_APPTABS); 36106f6ba60Sopenharmony_ci if (upperScreenTabsFlag) { 36206f6ba60Sopenharmony_ci if (line.find("|H:Present Fence ") != std::string::npos) { 36306f6ba60Sopenharmony_ci fenceIdTabs = GetFenceId(line); 36406f6ba60Sopenharmony_ci LOGI("fenceIdTabs: (%s)", std::to_string(fenceIdTabs).c_str()); 36506f6ba60Sopenharmony_ci } 36606f6ba60Sopenharmony_ci std::string waitFenceId = "|H:Waiting for Present Fence " + std::to_string(fenceIdTabs); 36706f6ba60Sopenharmony_ci if (line.find(waitFenceId) != std::string::npos) { 36806f6ba60Sopenharmony_ci nowTabsTime = std::stod(SmartPerf::StallingRateTrace::GetOnScreenTimeStart(line)); 36906f6ba60Sopenharmony_ci LOGI("nowTabsTime: (%s)", std::to_string(nowTabsTime).c_str()); 37006f6ba60Sopenharmony_ci LOGI("lastTabsTime: (%s)", std::to_string(lastTabsTime).c_str()); 37106f6ba60Sopenharmony_ci LOGI("roundTabsTime: (%s)", std::to_string(roundTabsTime).c_str()); 37206f6ba60Sopenharmony_ci GetFrameLossTime(nowTabsTime, lastTabsTime, roundTabsTime, frameLossTabsTime); 37306f6ba60Sopenharmony_ci LOGI("app tabs frameLossTabsTime: (%s)", std::to_string(frameLossTabsTime).c_str()); 37406f6ba60Sopenharmony_ci lastTabsTime = nowTabsTime; 37506f6ba60Sopenharmony_ci upperScreenTabsFlag = false; 37606f6ba60Sopenharmony_ci } 37706f6ba60Sopenharmony_ci } 37806f6ba60Sopenharmony_ci } 37906f6ba60Sopenharmony_ci} 38006f6ba60Sopenharmony_ci 38106f6ba60Sopenharmony_cidouble StallingRateTrace::GetFrameRate(const std::string &line) const 38206f6ba60Sopenharmony_ci{ 38306f6ba60Sopenharmony_ci double rate = 0; 38406f6ba60Sopenharmony_ci std::string delimiter = "rate: "; 38506f6ba60Sopenharmony_ci if (line.find("now:") != std::string::npos && line.find("rate:") != std::string::npos) { 38606f6ba60Sopenharmony_ci std::string delimiter1 = ", now:"; 38706f6ba60Sopenharmony_ci size_t pos1 = line.find(delimiter); 38806f6ba60Sopenharmony_ci std::string result1 = line.substr(pos1 + delimiter.length()); 38906f6ba60Sopenharmony_ci size_t pos2 = line.find(delimiter1); 39006f6ba60Sopenharmony_ci std::string result2 = result1.substr(0, pos2); 39106f6ba60Sopenharmony_ci rate = std::stod(result2.c_str()); 39206f6ba60Sopenharmony_ci } 39306f6ba60Sopenharmony_ci if (line.find("rate:") != std::string::npos) { 39406f6ba60Sopenharmony_ci size_t pos = line.find(delimiter); 39506f6ba60Sopenharmony_ci std::string result = line.substr(pos + delimiter.length()); 39606f6ba60Sopenharmony_ci rate = std::stod(result.c_str()); 39706f6ba60Sopenharmony_ci } 39806f6ba60Sopenharmony_ci return rate; 39906f6ba60Sopenharmony_ci} 40006f6ba60Sopenharmony_ci 40106f6ba60Sopenharmony_ciint StallingRateTrace::GetFenceId(const std::string &line) const 40206f6ba60Sopenharmony_ci{ 40306f6ba60Sopenharmony_ci std::string delimiter = "H:Present Fence "; 40406f6ba60Sopenharmony_ci size_t pos = line.find(delimiter); 40506f6ba60Sopenharmony_ci std::string result = line.substr(pos + delimiter.length()); 40606f6ba60Sopenharmony_ci int presentFenceId = std::atoi(result.c_str()); 40706f6ba60Sopenharmony_ci return presentFenceId; 40806f6ba60Sopenharmony_ci} 40906f6ba60Sopenharmony_ci 41006f6ba60Sopenharmony_cistd::string StallingRateTrace::GetOnScreenTimeStart(const std::string &line) const 41106f6ba60Sopenharmony_ci{ 41206f6ba60Sopenharmony_ci std::string startTime = "0"; 41306f6ba60Sopenharmony_ci size_t subNum = 7; 41406f6ba60Sopenharmony_ci size_t positionFirst = line.find("...."); 41506f6ba60Sopenharmony_ci size_t positionSecond = line.find(":"); 41606f6ba60Sopenharmony_ci startTime = line.substr(positionFirst + subNum, positionSecond - positionFirst - subNum); 41706f6ba60Sopenharmony_ci return startTime; 41806f6ba60Sopenharmony_ci} 41906f6ba60Sopenharmony_ci 42006f6ba60Sopenharmony_cidouble StallingRateTrace::GetTimes(const std::string &line, const std::string &sign) const 42106f6ba60Sopenharmony_ci{ 42206f6ba60Sopenharmony_ci size_t positionFirst = line.find("...."); 42306f6ba60Sopenharmony_ci size_t positionSecond = line.find(":"); 42406f6ba60Sopenharmony_ci if (positionFirst != std::string::npos && positionSecond != std::string::npos) { 42506f6ba60Sopenharmony_ci if (line.find(sign) != std::string::npos) { 42606f6ba60Sopenharmony_ci size_t subNum = 7; 42706f6ba60Sopenharmony_ci return std::stod(line.substr(positionFirst + subNum, positionSecond - positionFirst - subNum)); 42806f6ba60Sopenharmony_ci } 42906f6ba60Sopenharmony_ci } 43006f6ba60Sopenharmony_ci return 0.0; 43106f6ba60Sopenharmony_ci} 43206f6ba60Sopenharmony_ci} 43306f6ba60Sopenharmony_ci} 434