#pragma once #include "../RenderAble.h" namespace YSG { struct PerformanceLine { PerformanceLine() = default; explicit PerformanceLine(const QString& data) { mData = data; int argIndex = 1; while(data.contains("%" + QString::number(argIndex))) { argIndex++; } mPlaceHolderNum = argIndex - 1; mValues.resize(mPlaceHolderNum); } QString mData; int mPlaceHolderNum{}; QVector mValues; QString toString() { QString ret = mData; int argIndex = 1; for (const double& value : mValues) { ret =ret.replace("%"+QString::number(argIndex), QString::number(value, 'f', 2)); argIndex++; } return ret; } }; struct CounterLine { QString mName; std::chrono::system_clock::time_point mTotalStart; int mCountTimes = 0; [[nodiscard]] double getRate() const { double useTime = std::chrono::duration(std::chrono::system_clock::now() - mTotalStart).count(); return mCountTimes / useTime; } [[nodiscard]] QString toString() const { double useTime = std::chrono::duration(std::chrono::system_clock::now() - mTotalStart).count(); // return QString("%1 :%2 (次/s) 当前次数%3,当前时间 %4") // .arg(mName, QString::number(mCountTimes / useTime, 'f', 2)) // .arg(mCountTimes) // .arg(QString::number(useTime, 'f', 2)); return QString("%1 :%2 (次/s)") .arg(mName, QString::number(mCountTimes / useTime, 'f', 2)); } }; class PerformanceShower : public QWidget { Q_OBJECT public: explicit PerformanceShower(QWidget *parent = nullptr); QFont mFont; int mTopMargin = 4, mLeftMargin = 4, mRightMargin = 28, mBottomMargin = 8; int mOldSize = -1; QVector mAllInfo; Q_INVOKABLE void firstResize(int w, int h); void refresh(); QVector all(); SpinLock mMutex; QMap mInfoMap; QMap mCounter; QVector mFixedInfo; QMap mInfos; void refreshCounter(); void counterIncrease(const QString& counterName); protected: void paintEvent(QPaintEvent *event) override; bool mMoving = false; QPoint mStartPos, mStartGlobalPos; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void resizeEvent(QResizeEvent *event) override; }; class Cacl { public: std::chrono::system_clock::time_point mStart; QString mName; PerformanceShower *mPerformanceShower{}; Cacl(const QString& name, PerformanceShower* performanceShower) { if(!performanceShower) return; mStart = std::chrono::system_clock::now(); mName = name; mPerformanceShower = performanceShower; } ~Cacl() { if(!mPerformanceShower) return; double useTime = std::chrono::duration(std::chrono::system_clock::now() - mStart).count() * 1000; if(!mPerformanceShower->mInfoMap.contains(mName)) { mPerformanceShower->mInfoMap[mName] = PerformanceLine(mName); } PerformanceLine& data = mPerformanceShower->mInfoMap[mName]; data.mValues[0] = useTime; if(data.mValues.size() > 1) { data.mValues[1] = data.mValues[1] * 0.9 + useTime * 0.1; //约等于近10次平均 } } }; }