Thursday, 31 December 2020

A new code example for the "Qt Performance" book


Recently I added a new example* to my "Qt5 Performance" book's resources that I didn't manage to include in the original release - the trace macros creating output in chrome:tracing format. 

I think it's a very cool technique - instrument your code and than inspect the result as a graphic! On Linux we have flame graph support in the standard tooling integrated with Qt Creator.

On Windows, however, we do not have such a thing! And because I decided to use Windows as the deveolpment platform for my book, we have a kind of problem here, so creative solutions are needed!

And I already came up with an idea for that in the book - we can use libraries (like minitrace, the library we are using in this example ) to generate profiling output in a format that the Chrome's** trace viewer will understand! You didn't know that Google's Chrome had a built-in profiler? Some people assume it’s only for profiling “web stuff” like JavaScript and DOM, but we can use it as a really nice frontend for our own profiling data.

However, due to lack of time I couldn't try it out when I was writing the book 😞, but with the new example I added  I was able to generate output you see visualizedin the figure below:
























Here is the code example I used - as you can see, you have only to insert some MTR_() macros here and there:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int main(int argc, char *argv[])
{
  mtr_init("trace.json");
 
  MTR_META_PROCESS_NAME("QmlWithModel");
  MTR_META_THREAD_NAME("Main GUI tread");
  MTR_BEGIN("main", "main()");
 
  QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  QGuiApplication app(argc, argv);
 
  QStringList countryList;
  countryList << "Thinking...";
 
  MTR_BEGIN("main", "load QML View");
  QQuickView view;
  QQmlContext *ctxt = view.rootContext();
  ctxt->setContextProperty("myModel", QVariant::fromValue(countryList));
 
  view.setSource(QUrl("qrc:/main.qml"));
  view.show();
  MTR_END("main", "load QML View");
 
  // get country names from network
  MTR_BEGIN("main", "init NetworkMgr");
  QNetworkAccessManager networkManager;
  MTR_END("main", "init NetworkMgr");
 
  ....

PS: heob-3 (i.e the new version of the heob memory profiler we discussed in the book) has a sampling profiler with optional flame graph output!!! I think I have to try it out in the near future!

--
* you can find the new example here, and the generated JSON file here

** Chrome browser's about:tracing tool. You can use it like this:

  • go to chrome://tracing in Chrome
  • click “Load” and open your JSON file (or alternatively drag the file into Chrome)
  • that's all

No comments: