{"id":1755,"date":"2013-03-28T23:32:06","date_gmt":"2013-03-28T22:32:06","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=1755"},"modified":"2013-04-25T07:57:57","modified_gmt":"2013-04-25T06:57:57","slug":"qt-source-und-kleine-perlen","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=1755","title":{"rendered":"Qt Source und kleine Perlen"},"content":{"rendered":"<p>Ich habe in den letzten 3 Tagen viel Qt Source gelesen und da war schon viel Wirr und Krams dabei. Aber auch kleine Perlen wie diese Zeile in QRectF QPolygonF::boundingRect() const zeige<br \/>\n<code><br \/>\nregister const QPointF *pd = constData();<br \/>\nfor (int i = 1; i < size(); ++i) {\n++pd;\n}\n<\/code><\/p>\n<p>Da kennt ein Performance-Fan das Keyword register. Ich war richtig \u00fcberrascht und erfreut auch mal ein St\u00fcck optimierten Code zu finden.<br \/>\nErkl\u00e4rung: das Keyword register sagt dem compiler, dass der Pointer bitte die ganze Zeit \u00fcber in einem CPU Register bleiben soll. Die Registert sind ja die schnellsten Speicher die es in so einer CPU gibt, und da der Pointer in der nachfolgenden Schleife etliche mal benutzt wird, macht das auch Sinn.<br \/>\nSogar das const keyword ist dabei. Das sagt dem Compiler, dass er diesen Pointer nicht in den Hauptspeicher zur\u00fcck speicher muss, da er zu 100% nicht ver\u00e4ndert worden ist. Und der Zugriff auf den Hauptspeicher ist im Vergleich zu dem Registert bestimmt 1000x langsamer.<\/p>\n<p><code>++pd;<\/code><br \/>\nSelbst bei dieser recht unbedeuteten Zeile Code gibt es etwas zu sagen. Es gibt eine Menge Post im Internet die vermuten, dass ++i schneller sei als i++ [1] [2]. Aber der Compiler wird das schon optimieren. Jedenfalls wei\u00df der Autor von QPolygonF::boundingRect() das, und ich finde es sch\u00f6n :)<\/p>\n<p>[1] http:\/\/stackoverflow.com\/questions\/24853\/what-is-the-difference-between-i-and-i<br \/>\n[2] http:\/\/stackoverflow.com\/questions\/24886\/is-there-a-performance-difference-between-i-and-i-in-c<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe in den letzten 3 Tagen viel Qt Source gelesen und da war schon viel Wirr und Krams dabei. Aber auch kleine Perlen wie diese Zeile in QRectF QPolygonF::boundingRect() const zeige register const QPointF *pd = constData(); for (int i = 1; i < size(); ++i) { ++pd; } Da kennt ein Performance-Fan das [&hellip;]\n<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17,31,12],"class_list":["post-1755","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp","tag-faster-code","tag-qt"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1755"}],"version-history":[{"count":7,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1755\/revisions"}],"predecessor-version":[{"id":1768,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1755\/revisions\/1768"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1755"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}