QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
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 
43  // *INDENT-OFF*
44 
52  {
53  Name = Qt::UserRole + 1,
54  Group,
55  Elapsed,
56  ParentElapsed,
57  Id,
58  };
59  // *INDENT-ON*
60 
66  QgsRuntimeProfilerNode( const QString &group, const QString &name, const QString &id = QString() );
67 
72 
74 
80  QgsRuntimeProfilerNode *parent() { return mParent; }
81 
87  QStringList fullParentPath() const;
88 
92  QVariant data( int role = Qt::DisplayRole ) const;
93 
97  int childCount() const { return mChildren.size(); }
98 
102  void addChild( std::unique_ptr< QgsRuntimeProfilerNode > child );
103 
109  int indexOf( QgsRuntimeProfilerNode *child ) const;
110 
115  QgsRuntimeProfilerNode *child( const QString &group, const QString &name, const QString &id = QString() );
116 
120  QgsRuntimeProfilerNode *childAt( int index );
121 
125  void clear();
126 
130  void removeChildAt( int index );
131 
136  void start();
137 
141  void stop();
142 
146  void setElapsed( double time );
147 
153  double elapsed() const;
154 
159  double totalElapsedTimeForChildren( const QString &group ) const;
160 
161  private:
162  std::deque< std::unique_ptr< QgsRuntimeProfilerNode > > mChildren;
163  QgsRuntimeProfilerNode *mParent = nullptr;
164  QElapsedTimer mProfileTime;
165  double mElapsed = 0;
166 
167  QString mId;
168  QString mName;
169  QString mGroup;
170 
171 };
172 #endif
173 
187 class CORE_EXPORT QgsRuntimeProfiler : public QAbstractItemModel
188 {
189  Q_OBJECT
190 
191  public:
192 
201 
209  Q_DECL_DEPRECATED void beginGroup( const QString &name ) SIP_DEPRECATED;
210 
216  Q_DECL_DEPRECATED void endGroup() SIP_DEPRECATED;
217 
222  QStringList childGroups( const QString &parent = QString(), const QString &group = "startup" ) const;
223 
232  void start( const QString &name, const QString &group = "startup", const QString &id = QString() );
233 
237  void end( const QString &group = "startup" );
238 
247  void record( const QString &name, double time, const QString &group = "startup", const QString &id = QString() );
248 
253  double profileTime( const QString &name, const QString &group = "startup" ) const;
254 
258  void clear( const QString &group = "startup" );
259 
264  double totalTime( const QString &group = "startup" );
265 
269  QSet< QString > groups() const { return mGroups; }
270 
277  bool groupIsActive( const QString &group ) const;
278 
282  static QString translateGroupName( const QString &group );
283 
284  // Implementation of virtual functions from QAbstractItemModel
285 
286  int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
287  int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
288  QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
289  QModelIndex parent( const QModelIndex &child ) const override;
290  QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
291  QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
292 
298  QString asText( const QString &group = QString() );
299 
300 #ifndef SIP_RUN
302  signals:
303 
304  void started( const QString &group, const QStringList &path, const QString &name, const QString &id );
305  void ended( const QString &group, const QStringList &path, const QString &name, const QString &id, double elapsed );
307 #endif
308 
312  void groupAdded( const QString &group );
313 
314  private slots:
315 
316  void otherProfilerStarted( const QString &group, const QStringList &path, const QString &name, const QString &id );
317  void otherProfilerEnded( const QString &group, const QStringList &path, const QString &name, const QString &id, double elapsed );
318 
319  private:
320 
321  static QgsRuntimeProfiler *threadLocalInstance();
322  static QgsRuntimeProfiler *sMainProfiler;
323  bool mInitialized = false;
324  void setupConnections();
325 
326  QgsRuntimeProfilerNode *pathToNode( const QString &group, const QString &path ) const;
327  QgsRuntimeProfilerNode *pathToNode( const QString &group, const QStringList &path ) const;
328  QModelIndex node2index( QgsRuntimeProfilerNode *node ) const;
329  QModelIndex indexOfParentNode( QgsRuntimeProfilerNode *parentNode ) const;
330  void extractModelAsText( QStringList &lines, const QString &group, const QModelIndex &parent = QModelIndex(), int level = 0 );
331 
335  QgsRuntimeProfilerNode *index2node( const QModelIndex &index ) const;
336 
337  QMap< QString, QStack< QgsRuntimeProfilerNode * > > mCurrentStack;
338  std::unique_ptr< QgsRuntimeProfilerNode > mRootNode;
339 
340  QSet< QString > mGroups;
341 
342  friend class QgsApplication;
343 };
344 
345 
362 class CORE_EXPORT QgsScopedRuntimeProfile
363 {
364  public:
365 
375  QgsScopedRuntimeProfile( const QString &name, const QString &group = "startup", const QString &id = QString() );
376 
381 
390  void switchTask( const QString &name );
391 
392  private:
393 
394  QString mGroup;
395 
396 };
397 
398 
399 #endif // QGSRUNTIMEPROFILER_H
Extends QApplication to provide access to QGIS specific resources such as theme paths,...
A node representing an entry in a QgsRuntimeProfiler.
QgsRuntimeProfilerNode * parent()
Returns the node's parent node.
QgsRuntimeProfilerNode & operator=(const QgsRuntimeProfilerNode &other)=delete
QgsRuntimeProfilerNode cannot be copied.
QgsRuntimeProfilerNode(const QgsRuntimeProfilerNode &other)=delete
QgsRuntimeProfilerNode cannot be copied.
CustomRole
Custom node data roles.
int childCount() const
Returns the number of child nodes owned by this node.
Provides a method of recording run time profiles of operations, allowing easy recording of their over...
void groupAdded(const QString &group)
Emitted when a new group has started being profiled.
~QgsRuntimeProfiler() override
Scoped object for logging of the runtime for a single operation or group of operations.
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_MONKEYPATCH_SCOPEENUM_UNNEST(OUTSIDE_CLASS, FORMERNAME)
Definition: qgis_sip.h:271