QGIS API Documentation  3.17.0-Master (8af46bc54f)
qgsruntimeprofiler.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsruntimeprofiler.h
3  ---------------------
4  begin : June 2016
5  copyright : (C) 2016 by Nathan Woodrow
6  email : woodrow dot nathan at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 #ifndef QGSRUNTIMEPROFILER_H
16 #define QGSRUNTIMEPROFILER_H
17 
18 #include <QTime>
19 #include <QElapsedTimer>
20 #include "qgis_sip.h"
21 #include <QPair>
22 #include <QStack>
23 #include <QList>
24 #include <QAbstractItemModel>
25 #include <memory>
26 #include <deque>
27 #include <QSet>
28 #include "qgis_core.h"
29 
30 #ifndef SIP_RUN
31 
39 class CORE_EXPORT QgsRuntimeProfilerNode
40 {
41  public:
42 
44  enum Roles
45  {
46  Name = Qt::UserRole + 1,
50  };
51 
55  QgsRuntimeProfilerNode( const QString &group, const QString &name );
56 
58  QgsRuntimeProfilerNode( const QgsRuntimeProfilerNode &other ) = delete;
60  QgsRuntimeProfilerNode &operator=( const QgsRuntimeProfilerNode &other ) = delete;
61 
63 
69  QgsRuntimeProfilerNode *parent() { return mParent; }
70 
74  QStringList fullParentPath() const;
75 
79  QVariant data( int role = Qt::DisplayRole ) const;
80 
84  int childCount() const { return mChildren.size(); }
85 
89  void addChild( std::unique_ptr< QgsRuntimeProfilerNode > child );
90 
96  int indexOf( QgsRuntimeProfilerNode *child ) const;
97 
102  QgsRuntimeProfilerNode *child( const QString &group, const QString &name );
103 
107  QgsRuntimeProfilerNode *childAt( int index );
108 
112  void clear();
113 
117  void removeChildAt( int index );
118 
123  void start();
124 
128  void stop();
129 
133  void setElapsed( double time );
134 
140  double elapsed() const;
141 
146  double totalElapsedTimeForChildren( const QString &group ) const;
147 
148  private:
149  std::deque< std::unique_ptr< QgsRuntimeProfilerNode > > mChildren;
150  QgsRuntimeProfilerNode *mParent = nullptr;
151  QElapsedTimer mProfileTime;
152  double mElapsed = 0;
153 
154  QString mName;
155  QString mGroup;
156 
157 };
158 #endif
159 
173 class CORE_EXPORT QgsRuntimeProfiler : public QAbstractItemModel
174 {
175  Q_OBJECT
176 
177  public:
178 
186  ~QgsRuntimeProfiler() override;
187 
195  Q_DECL_DEPRECATED void beginGroup( const QString &name ) SIP_DEPRECATED;
196 
202  Q_DECL_DEPRECATED void endGroup() SIP_DEPRECATED;
203 
208  QStringList childGroups( const QString &parent = QString(), const QString &group = "startup" ) const;
209 
215  void start( const QString &name, const QString &group = "startup" );
216 
220  void end( const QString &group = "startup" );
221 
226  double profileTime( const QString &name, const QString &group = "startup" ) const;
227 
231  void clear( const QString &group = "startup" );
232 
237  double totalTime( const QString &group = "startup" );
238 
242  QSet< QString > groups() const { return mGroups; }
243 
250  bool groupIsActive( const QString &group ) const;
251 
255  static QString translateGroupName( const QString &group );
256 
257  // Implementation of virtual functions from QAbstractItemModel
258 
259  int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
260  int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
261  QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
262  QModelIndex parent( const QModelIndex &child ) const override;
263  QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
264  QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
265 
266 #ifndef SIP_RUN
267  signals:
269 
270  void started( const QString &group, const QStringList &path, const QString &name );
271  void ended( const QString &group, const QStringList &path, const QString &name, double elapsed );
273 #endif
274 
278  void groupAdded( const QString &group );
279 
280  private slots:
281 
282  void otherProfilerStarted( const QString &group, const QStringList &path, const QString &name );
283  void otherProfilerEnded( const QString &group, const QStringList &path, const QString &name, double elapsed );
284 
285  private:
286 
287  static QgsRuntimeProfiler *threadLocalInstance();
288  static QgsRuntimeProfiler *sMainProfiler;
289  bool mInitialized = false;
290  void setupConnections();
291 
292  QgsRuntimeProfilerNode *pathToNode( const QString &group, const QString &path ) const;
293  QgsRuntimeProfilerNode *pathToNode( const QString &group, const QStringList &path ) const;
294  QModelIndex node2index( QgsRuntimeProfilerNode *node ) const;
295  QModelIndex indexOfParentNode( QgsRuntimeProfilerNode *parentNode ) const;
296 
300  QgsRuntimeProfilerNode *index2node( const QModelIndex &index ) const;
301 
302  QMap< QString, QStack< QgsRuntimeProfilerNode * > > mCurrentStack;
303  std::unique_ptr< QgsRuntimeProfilerNode > mRootNode;
304 
305  QSet< QString > mGroups;
306 
307  friend class QgsApplication;
308 };
309 
310 
327 class CORE_EXPORT QgsScopedRuntimeProfile
328 {
329  public:
330 
337  QgsScopedRuntimeProfile( const QString &name, const QString &group = "startup" );
338 
343 
352  void switchTask( const QString &name );
353 
354  private:
355 
356  QString mGroup;
357 
358 };
359 
360 
361 #endif // QGSRUNTIMEPROFILER_H
Provides a method of recording run time profiles of operations, allowing easy recording of their over...
Extends QApplication to provide access to QGIS specific resources such as theme paths, database paths etc.
Scoped object for logging of the runtime for a single operation or group of operations.
Total elapsed time for node&#39;s parent.
QSet< QString > groups() const
Returns the set of known groups.
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
A node representing an entry in a QgsRuntimeProfiler.
Roles
Custom node data roles.
int childCount() const
Returns the number of child nodes owned by this node.
QgsRuntimeProfilerNode * parent()
Returns the node&#39;s parent node.