Qt Blog.

Qt Blog.

QCoreApplication mini benchmark.

Publisert tirsdag 14. august 2012.

Av robusthet og sikkerhetsmessige grunner er det ofte fornuftig a dele funksjonalitet i forskjellige mindre bin re filer (daemoner) enn a ha noen store og monolitiske applikasjoner.

Qt 4 introduserte modul re Qt-biblioteker for a aktivere Qt-baserte daemoner som ikke krever noen GUI. Takket v re det sterke embedded fokuset og flere sane arkitekturbeslutninger, bringer Qt 5 dette til et nytt niva.

La oss se pa noen enkel hovedfunksjon:

QCoreApplication app (argc, argv);

QTimer :: singleShot (3000, & app, SLOT (avslutte ()));

Denne ikke-gui Qt appen gar i tomgang i ca 3 sekunder, og avsluttes deretter.

Pa min vanilje i386 Kubuntu 12.04 med Qt 4.8.1 rapporterer valgrinds massifverktoy en maksimal heapminnebruk pa rundt 102 kb, mens callgrind rapporterer en instruksjonskostnad pa rundt 1,9 millioner (*).

La oss se pa tallene fra dagens bygning av Qt 5: Massif rapporterer en topphoyde pa 4,9 kb og callgrind rapporterer en instruksjonskostnad pa ca 114k.

Dette betyr at Qt 5 bruker omtrent 20 ganger mindre minne og ca 16 ganger mindre instruksjoner for a konstruere en QCoreApplication og spin en hendelseslokke.

Det er flere grunner til det. Mest sannsynlig antar Qt 5 at alle strengene er unicode, sa initialiseringen av tekstkonverteringskodinger skjer bare nar den forste ikke-unicode-strengen kommer sammen. Selv om Qt 5 har betydelig forbedret plugin loading ytelse, er ikke lasting av dem enda raskere

Ulike andre forbedringer legger ogsa opp, f.eks. C + + 11-stotten i Qt 5 betyr at vi ikke trenger noen tildeling for a lage unicode QString-objekter, og flyttbare objekter rundt har ogsa blitt billigere.

Sammendrag, ha det goy a skrive Qt 5-baserte daemoner, og hvis du har noen ide om hvordan du gjor koden enda mer effektiv, ser vi deg pa Qt’s codereview

(*) Ansvarsfraskrivelse: Anvisningskostnaden viser ikke hvor fort koden er, men hvor mange instruksjoner ble behandlet av CPU. V r oppmerksom pa at jeg i alle tilfeller bare har malt ytelsen til main (), ignorerer overhead av OS-symbolet og bibliotekslosning, da det kan optimaliseres med prelinking eller forking fra en hovedprosess.

Ingen relaterte innlegg.

28 kommentarer.

Koden burde virkelig v re et sted sa effektivt som dette.

C + + 11-stotte i Qt 5 betyr at vi ikke trenger noen tildeling for a lage unicode QString-objekter.

Kan noen peke meg til en mer grundig forklaring pa dette? Takk.

Stephen, C ++ 11 er den nye C ++-standarden som introduserer mange nye ting pa spraket. Sjekk pa wikipedia!

Jo, Thiago Macieira fantastiske innlegg om tabelldrevet programmering forklarer dette, men det er litt komplisert a forsta, selv nar han prover a forklare.

@Anon & # 8211; QCoreApplication-koden blokkerer ikke, men tillater a gjore asynkron kommunikasjon mellom trader, lokale kontakter, stikkontakter eller IPC, f.eks. multi-threaded agenter. Sleep () blokkerer bare appen, du vant ikke a motta og behandle meldinger.

@Stephen & # 8211; Se pa QStringLiteral i Qt 5s qstring.h.

Kan ikke vente pa a kunne bruke dette i KDE og se om det forbedrer :).

Takk, men hvorfor har jeg forskjellige resultater med Qt5 (bare gjenoppbygging fra mester)

Profildatafil & # 8216; callgrind.out.21373 & # 8217; (skaperen: callgrind-3.7.0)

Timerange: Grunnblokk 0 & # 8211; 510459.

Trigger: Programavslutning.

Profilert mal: ./qcoreapp (PID 21373, del 1)

Hendelser registrert: Ir.

Hendelser vist: Ir.

Arrangement sorteringsrekkefolge: Ir.

2.642.850 PROGRAM TOTALER.

748.048. do_lookup_x [/lib64/ld-2.15.so]

733.141. _dl_lookup_symbol_x [/lib64/ld-2.15.so]

475 755. _dl_relocate_object [/lib64/ld-2.15.so]

190.596. strcmp & # 8217; 2 [/ lib64/ld-2.15.so]

93.842. check_match.11337 [/lib64/ld-2.15.so]

57.500. _dl_addr [/lib64/libc-2.15.so]

48.304. _dl_name_match_p [/lib64/ld-2.15.so]

38.199. strcmp [/lib64/ld-2.15.so]

19.080. getenv [/lib64/libc-2.15.so]

14.597. _int_malloc [/lib64/libc-2.15.so]

13.792. _dl_map_object_from_fd [/lib64/ld-2.15.so]

13.396. _dl_map_object [/lib64/ld-2.15.so]

12.629. _dl_cache_libcmp [/lib64/ld-2.15.so]

12.052. _dl_check_map_versions [/lib64/ld-2.15.so]

11.533. _dl_map_object_deps [/lib64/ld-2.15.so]

9,293. _dl_fixup [/lib64/ld-2.15.so]

7.793. match_symbol [/lib64/ld-2.15.so]

6.991. _nl_intern_locale_data [/lib64/libc-2.15.so]

5,795. slab_allocator_alloc_chunk [/usr/lib64/libglib-2.0.so.0.3200.4]

5.396. _dl_sort_fini [/lib64/ld-2.15.so]

4,451. _int_free [/lib64/libc-2.15.so]

4.182. enter.11385 [/ lib64/ld-2.15.so]

4.142. _dl_load_cache_lookup [/lib64/ld-2.15.so]

3.958. malloc [/ lib64/libc-2.15.so]

3.839. memset [/ lib64/ld-2.15.so]

3.646. strlen [/ lib64/libc-2.15.so]

3.166. bsearch [/lib64/libc-2.15.so]

3.046. _dl_new_object [/lib64/ld-2.15.so]

3.002. open_verify [/lib64/ld-2.15.so]

2.919. bcmp [/lib64/libc-2.15.so]

2.448. __libc_memalign [/lib64/ld-2.15.so]

2.268. _dl_runtime_resolve [/lib64/ld-2.15.so]

2.256. pthread_mutex_lock [/lib64/libpthread-2.15.so]

2.180. indeks [/lib64/libc-2.15.so]

2.176. __GI_strcmp [/lib64/libc-2.15.so]

2.106. __pthread_mutex_unlock_usercnt [/lib64/libpthread-2.15.so]

2.098. memcpy [/lib64/ld-2.15.so]

2.009. open_path [/lib64/ld-2.15.so]

1,960. g_slice_alloc [/usr/lib64/libglib-2.0.so.0.3200.4]

1.952. g_mutex_get_impl [/usr/lib64/libglib-2.0.so.0.3200.4]

1.836. _dl_catch_error [/lib64/ld-2.15.so]

1.755. mempcpy [/lib64/ld-2.15.so]

1.604. dl_main [/ lib64/ld-2.15.so]

1.438. memmove [/lib64/ld-2.15.so]

1.361. __cxa_finalize [/lib64/libc-2.15.so]

1.245. __GI_strncmp [/lib64/libc-2.15.so]

1.211. strsep [/lib64/ld-2.15.so]

1.206. intel_02_known_compare [/lib64/libc-2.15.so]

1.157. _nl_load_locale_from_archive [/lib64/libc-2.15.so]

1.095. malloc_consolidate [/lib64/libc-2.15.so]

1.056. __GI_strlen [/lib64/libc-2.15.so]

1,026. calloc [/lib64/libc-2.15.so]

2.642.850 PROGRAM TOTALER.

748.048. do_lookup_x [/lib64/ld-2.15.so]

733.141. _dl_lookup_symbol_x [/lib64/ld-2.15.so]

475 755. _dl_relocate_object [/lib64/ld-2.15.so]

190.596. strcmp & # 8217; 2 [/ lib64/ld-2.15.so]

@Max: Som jeg sa, sa jeg bare pa tiden brukt i main (), ikke symbolopplosningen ting (do_lookup_x og venner). Ogsa, du synes a ha bygget Qt med glib, mens jeg gjorde en vanilje no-glib build.

A bruke QtCore for server apps er veldig hyggelig faktisk. Jeg har skrevet en monster financial serverice QtCore app med titalls prosesser og hundrevis av trader og tcp-tilkoblinger. Jeg har ogsa innarbeidet Qt ‘s Network SQL, og Thread moduler ogsa. Hvor det egentlig lonner seg for meg, er i kodeaterbruk. En Qt-klient-app og en QtCore-serverapp kan utlisere de samme klassene for a sende data tilbake og fjerde. Du kan opprette disse klassene som en del av et databibliotek som begge koder (klient og server) kobler til. Bruk av Qt DataStream-operatorer til a serialisere og deserialisere medlemmer av en klasse sammen med Qt-primater (qint32, qfloat, etc) for nettverkskoding, noe som betyr at du ikke trenger a bekymre deg for lil / big endian & # 8211; Qt gjor alt for deg. Og er mye mye raskere og bruker noe som json til a kode / dekode strengverdier.

Ser frem til a migrere til Qt5 i n r fremtid.

& # 8220; vi vil se deg pa Qt’s codereview & # 8221;

Ikke hvis noen ikke klikker pa knappen for a godta kodens omkalling. Du bor bli kvitt det for a tiltrekke seg flere utviklere.

@RealNC & # 8211; Vennligst forsta at dette er en utviklerblogg, vi har ingen innflytelse pa lisensproblemer. V r ogsa oppmerksom pa at relicensing er det av en grunn og forlat det, kan skade Qt-prosjektet mer enn a la det v re intakt.

Litt trolling (og for det meste off topic), men ikke helt: Hva med a forbedre ytelsen til QDir :: entryList nar du sorterer oppforinger etter tid? For oyeblikket er dette forferdelig sakte (testet med 10000 oppforinger), og man kan enkelt skrive en raskere algoritme som bare tar 2% av tiden ved hjelp av libc opendir () / readdir () (gitt at det ikke er altfor b rbart , men det viser at det fortsatt er noe a vinne, til og med legge til spesielle tilfeller for alle malplattformer).

Problemet synes a v re at Qt forsoker a konvertere alle tidsstemplene til UTC (og det pa en sv rt ikke-effektiv mate) i stedet for a sammenligne dem direkte (i et enkelt filsystem, i en enkelt katalog, etter min kunnskap kan filene & # 8217; De har ikke forskjellige tidssoner for st_mtime).

@thp: Jeg gjorde litt undersokelse pa dette litt videre basert pa informasjonen du oppgav. Kjerneproblemet synes a v re at QDateTime :: fromTime_t () ikke var a sette den opprettede QDateTime til UTC, noe som betyr at den var & # 8211; som du noterte & # 8211; stadig gjor timezone konverteringer.

time_t er UTC-tid per definisjon, sa det var ikke noe behov for dette, og jeg har opprettet en prototypepatch som fikser dette pa http://qtl.me/0001-WIP-speed-up-sorting-of-dir- oppforinger-nar-sortert-for-d.patch, som tar min referanse ned fra.

Jeg koblet deg til dette pa twitter, men v r sa snill a gi det en tur hvis du kan. Jeg vil se om du trykker pa den for a kode omtale nar jeg far litt fritid.

(men dette er bare lykke til, v r sa snill a rapportere ting pa bugtracker i fremtiden, ellers vil de mer enn sannsynlig bli borte i stoy eller glemt ..)

hvor er Qt5 beta? vil du slippe den med bin re koder?

@tiara, Du kan finne det daglige beta oyeblikksbildet her: http://releases.qt-project.org/qt5.0/beta-snapshots/ for beta-utgivelsen ankommer.

@Harald: Jeg foreslar at du tar en titt pa perf-verktoyet for a fa statistikk om ytelse, i stedet for callgrind. Det er mindre noyaktig, men det er ogsa mer ekte.

@Thiago & # 8211; takk for hint, jeg vil prove det neste gang.

Referansen er ganske ikke-deterministisk, siden ting som filsystem, glibc-versjon eller til og med lengden pa brukernavnet ditt endrer resultatet, sa bruker du et mer presist verktoy, endres ikke meldingen til denne bloggen, noe som er det Qt 5 er mye bedre

Hva er lisensen til Qt5?

Kommersiell, GPL, LGPL, BSD?

Distribuere Qt5 til Meego, dens ytelse vil bli pavist.

Meego er et dodt OS.

Flott, sa i tillegg til a vente raskere, kan jeg vente mindre ogsa. Hyggelig!

Dette er gode nyheter. Jeg bruker QT4 til a utvikle serverprogrammer, og eventuelle lagringer i minnet og instruksjonene er velkomne.

Litt av emnet, men det ville v re fint om QT5 kunne v re enklere a kompilere pa ikke-gui-systemer. Vi fjerner eksternt QT4 pa vare servere, som ikke har noe Xwindows system installert, og bruker vanligvis mye tid hacking config og bygger filer for a fa det til a fungere. Det betyr at vi bare oppgraderer en gang i mellom. Ville v re flott a ha en & # 8211; no-gui-bryter pa konfigurere (som jeg husker tidligere versjoner pleide a ha).

@Steph & # 8211; Min nav rende Qt 5 har en -no-gui-bryter

Litt off-topic til ytelse, sa unnskyld meg: det ville v re fint om Qt kunne brukes til system service daemons ogsa. Forelopig blir ikke hjembanen returnert riktig for de tilfellene (& # 8220; / & # 8221; pa Linux).

For eksempel er det merkelig (minst for meg) a prove a laste konfigurasjonsfiler fra slike steder (& # 8220; /. Config / MyProject & # 8221;). Dette var ogsa uklart for meg for en system-service-demon skrevet for eksempel pa QtCore.

Ellers, veldig bra jobb, og takk for blogginnlegget.

Vi er ansatt.

Kategorier.

Siste innlegg.

Nylige kommentarer.

Vladimir pa Qt 5.9.4 Utgitt Tuukka Turunen pa Qt 5.9.4 Utgitt Eric pa Qt 5.9.4 Utgitt Allan pa Qt 5.9.4 Utgitt Lanz pa Qt 5.9.4 Utgitt.

Folg #QtPeople.

Henkilon Qt (@theqtcompany) jakama julkaisu 1. 11ta 2017 klo 7.40 PDT.