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