Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmljscompilerstatsreporter.cpp
Go to the documentation of this file.
1
// Copyright (C) 2024 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
// Qt-Security score:significant
4
5
#
include
"qqmljscompilerstatsreporter_p.h"
6
7
#
include
<
QFileInfo
>
8
9
QT_BEGIN_NAMESPACE
10
11
namespace
QQmlJS
{
12
13
using
namespace
Qt
::
StringLiterals
;
14
15
AotStatsReporter
::
AotStatsReporter
(
const
AotStats
&
aotstats
,
const
QStringList
&
emptyModules
,
16
const
QStringList
&
onlyBytecodeModules
)
17
:
m_aotstats
(
aotstats
),
m_emptyModules
(
emptyModules
),
m_onlyBytecodeModules
(
onlyBytecodeModules
)
18
{
19
for
(
const
auto
&[
moduleUri
,
fileEntries
] :
aotstats
.
entries
().
asKeyValueRange
()) {
20
for
(
const
auto
&[
filepath
,
statsEntries
] :
fileEntries
.
asKeyValueRange
()) {
21
for
(
const
auto
&
entry
:
statsEntries
) {
22
m_fileCounters
[
moduleUri
][
filepath
].
codegens
+= 1;
23
if
(
entry
.
codegenResult
==
CodegenResult
::
Success
) {
24
m_fileCounters
[
moduleUri
][
filepath
].
successes
+= 1;
25
m_successDurations
.
append
(
entry
.
codegenDuration
);
26
}
else
if
(
entry
.
codegenResult
==
CodegenResult
::
Skip
) {
27
m_fileCounters
[
moduleUri
][
filepath
].
skips
+= 1;
28
}
29
}
30
m_moduleCounters
[
moduleUri
].
codegens
+=
m_fileCounters
[
moduleUri
][
filepath
].
codegens
;
31
m_moduleCounters
[
moduleUri
].
successes
+=
m_fileCounters
[
moduleUri
][
filepath
].
successes
;
32
m_moduleCounters
[
moduleUri
].
skips
+=
m_fileCounters
[
moduleUri
][
filepath
].
skips
;
33
}
34
m_totalCounters
.
codegens
+=
m_moduleCounters
[
moduleUri
].
codegens
;
35
m_totalCounters
.
successes
+=
m_moduleCounters
[
moduleUri
].
successes
;
36
m_totalCounters
.
skips
+=
m_moduleCounters
[
moduleUri
].
skips
;
37
}
38
}
39
40
void
AotStatsReporter
::
formatDetailedStats
(
QTextStream
&
s
)
const
41
{
42
s
<<
"############ AOT COMPILATION STATS ############\n"
;
43
QStringList
sortedModuleKeys
=
m_aotstats
.
entries
().
keys
();
44
sortedModuleKeys
.
sort
();
45
for
(
const
auto
&
moduleUri
:
std
::
as_const
(
sortedModuleKeys
)) {
46
const
auto
&
fileStats
=
m_aotstats
.
entries
()[
moduleUri
];
47
s
<< u"Module %1:\n"_s.
arg
(
moduleUri
);
48
if
(
fileStats
.
empty
()) {
49
s
<<
"No attempts at compiling a binding or function\n"
;
50
continue
;
51
}
52
53
QStringList
sortedFileKeys
=
fileStats
.
keys
();
54
sortedFileKeys
.
sort
();
55
for
(
const
auto
&
filename
:
std
::
as_const
(
sortedFileKeys
)) {
56
const
auto
&
entries
=
fileStats
[
filename
];
57
s
<< u"--File %1\n"_s.
arg
(
filename
);
58
if
(
entries
.
empty
()) {
59
s
<<
" No attempts at compiling a binding or function\n"
;
60
continue
;
61
}
62
63
int
successes
=
m_fileCounters
[
moduleUri
][
filename
].
successes
;
64
int
skips
=
m_fileCounters
[
moduleUri
][
filename
].
skips
;
65
s
<<
" "
<<
formatSuccessRate
(
entries
.
size
(),
successes
,
skips
) <<
"\n"
;
66
67
for
(
const
auto
&
stat
:
std
::
as_const
(
entries
)) {
68
s
<< u" %1: [%2:%3:%4]\n"_s.
arg
(
stat
.
functionName
)
69
.
arg
(
QFileInfo
(
filename
).
fileName
())
70
.
arg
(
stat
.
line
)
71
.
arg
(
stat
.
column
);
72
s
<< u" result: "_s;
73
switch
(
stat
.
codegenResult
) {
74
case
QQmlJS
::
CodegenResult
::
Success
:
s
<< u"Success\n"_s;
75
break
;
76
case
QQmlJS
::
CodegenResult
::
Skip
:
s
<< u"Skip: %1\n"_s.
arg
(
stat
.
message
);
77
break
;
78
case
QQmlJS
::
CodegenResult
::
Failure
:
s
<< u"Error: %1\n"_s.
arg
(
stat
.
message
);
79
break
;
80
}
81
s
<< u" duration: %1us\n"_s.
arg
(
stat
.
codegenDuration
.
count
());
82
}
83
s
<<
"\n"
;
84
}
85
}
86
}
87
88
void
AotStatsReporter
::
formatSummary
(
QTextStream
&
s
)
const
89
{
90
s
<<
"############ AOT COMPILATION STATS SUMMARY ############\n"
;
91
if
(
m_totalCounters
.
codegens
== 0 &&
m_emptyModules
.
empty
() &&
m_onlyBytecodeModules
.
empty
()) {
92
s
<<
"No attempted compilations to Cpp for bindings or functions.\n"
;
93
return
;
94
}
95
96
QStringList
sortedKeys
=
m_aotstats
.
entries
().
keys
();
97
sortedKeys
.
sort
();
98
for
(
const
auto
&
moduleUri
:
std
::
as_const
(
sortedKeys
)) {
99
const
auto
&
counters
=
m_moduleCounters
[
moduleUri
];
100
s
<< u"Module %1: "_s.
arg
(
moduleUri
)
101
<<
formatSuccessRate
(
counters
.
codegens
,
counters
.
successes
,
counters
.
skips
) <<
"\n"
;
102
}
103
104
for
(
const
auto
&
module
:
std
::
as_const
(
m_emptyModules
))
105
s
<< u"Module %1: No .qml files to compile.\n"_s.
arg
(
module
);
106
107
for
(
const
auto
&
module
:
std
::
as_const
(
m_onlyBytecodeModules
))
108
s
<< u"Module %1: No .qml files compiled (--only-bytecode).\n"_s.
arg
(
module
);
109
110
s
<<
"Total results: "
<<
formatSuccessRate
(
m_totalCounters
.
codegens
,
111
m_totalCounters
.
successes
,
112
m_totalCounters
.
skips
);
113
s
<<
"\n"
;
114
115
if
(
m_totalCounters
.
successes
!= 0) {
116
auto
totalDuration
=
std
::
accumulate
(
m_successDurations
.
cbegin
(),
m_successDurations
.
cend
(),
117
std
::
chrono
::
microseconds
(0));
118
const
auto
averageDuration
=
totalDuration
.
count
() /
m_totalCounters
.
successes
;
119
s
<< u"Successful codegens took an average of %1us\n"_s.
arg
(
averageDuration
);
120
}
121
}
122
123
QString
AotStatsReporter
::
format
()
const
124
{
125
QString
output
;
126
QTextStream
s
(&
output
);
127
128
formatDetailedStats
(
s
);
129
formatSummary
(
s
);
130
131
return
output
;
132
}
133
134
QString
AotStatsReporter
::
formatSuccessRate
(
int
codegens
,
int
successes
,
int
skips
)
const
135
{
136
if
(
codegens
== 0)
137
return
u"No attempted compilations"_s;
138
139
return
u"%1 of %2 (%3%4) %5bindings or functions compiled to Cpp successfully"_s
140
.
arg
(
successes
)
141
.
arg
(
codegens
)
142
.
arg
(
double
(
successes
) /
codegens
* 100, 0,
'g'
, 4)
143
.
arg
(u"%"_s)
144
.
arg
(
skips
? u"(%1 skipped) "_s.
arg
(
skips
) : u""_s);
145
}
146
147
}
// namespace QQmlJS
148
149
QT_END_NAMESPACE
QPlatformGraphicsBufferHelper
\inmodule QtGui
QQmlJS
Definition
qv4bytecodegenerator_p.h:26
qtdeclarative
src
qmlcompiler
qqmljscompilerstatsreporter.cpp
Generated on
for Qt by
1.14.0