5 #include "src/heap/code-stats.h" 7 #include "src/objects-inl.h" 8 #include "src/reloc-info.h" 14 void CodeStatistics::RecordCodeAndMetadataStatistics(HeapObject*
object,
16 if (object->IsScript()) {
17 Script* script = Script::cast(
object);
19 Object* source = script->source();
20 if (source->IsExternalString()) {
21 ExternalString external_source_string = ExternalString::cast(source);
22 int size = isolate->external_script_source_size();
23 size += external_source_string->ExternalPayloadSize();
24 isolate->set_external_script_source_size(size);
26 }
else if (object->IsAbstractCode()) {
28 AbstractCode abstract_code = AbstractCode::cast(
object);
29 int size = abstract_code->SizeIncludingMetadata();
30 if (abstract_code->IsCode()) {
31 size += isolate->code_and_metadata_size();
32 isolate->set_code_and_metadata_size(size);
34 size += isolate->bytecode_and_metadata_size();
35 isolate->set_bytecode_and_metadata_size(size);
40 isolate->code_kind_statistics()[abstract_code->kind()] +=
41 abstract_code->Size();
42 CodeStatistics::CollectCodeCommentStatistics(
object, isolate);
47 void CodeStatistics::ResetCodeAndMetadataStatistics(Isolate* isolate) {
48 isolate->set_code_and_metadata_size(0);
49 isolate->set_bytecode_and_metadata_size(0);
50 isolate->set_external_script_source_size(0);
52 ResetCodeStatistics(isolate);
60 void CodeStatistics::CollectCodeStatistics(PagedSpace* space,
62 HeapObjectIterator obj_it(space);
63 for (HeapObject* obj = obj_it.Next(); obj !=
nullptr; obj = obj_it.Next()) {
64 RecordCodeAndMetadataStatistics(obj, isolate);
72 void CodeStatistics::CollectCodeStatistics(LargeObjectSpace* space,
74 LargeObjectIterator obj_it(space);
75 for (HeapObject* obj = obj_it.Next(); obj !=
nullptr; obj = obj_it.Next()) {
76 RecordCodeAndMetadataStatistics(obj, isolate);
81 void CodeStatistics::ReportCodeStatistics(Isolate* isolate) {
83 int* code_kind_statistics = isolate->code_kind_statistics();
84 PrintF(
"\n Code kind histograms: \n");
85 for (
int i = 0;
i < AbstractCode::NUMBER_OF_KINDS;
i++) {
86 if (code_kind_statistics[
i] > 0) {
87 PrintF(
" %-20s: %10d bytes\n",
88 AbstractCode::Kind2String(static_cast<AbstractCode::Kind>(
i)),
89 code_kind_statistics[
i]);
95 if (isolate->code_and_metadata_size() > 0) {
96 PrintF(
"Code size including metadata : %10d bytes\n",
97 isolate->code_and_metadata_size());
99 if (isolate->bytecode_and_metadata_size() > 0) {
100 PrintF(
"Bytecode size including metadata: %10d bytes\n",
101 isolate->bytecode_and_metadata_size());
105 CommentStatistic* comments_statistics =
106 isolate->paged_space_comments_statistics();
108 "Code comment statistics (\" [ comment-txt : size/ " 109 "count (average)\"):\n");
110 for (
int i = 0;
i <= CommentStatistic::kMaxComments;
i++) {
111 const CommentStatistic& cs = comments_statistics[
i];
113 PrintF(
" %-30s: %10d/%6d (%d)\n", cs.comment, cs.size, cs.count,
120 void CodeStatistics::ResetCodeStatistics(Isolate* isolate) {
122 int* code_kind_statistics = isolate->code_kind_statistics();
123 for (
int i = 0;
i < AbstractCode::NUMBER_OF_KINDS;
i++) {
124 code_kind_statistics[
i] = 0;
128 CommentStatistic* comments_statistics =
129 isolate->paged_space_comments_statistics();
130 for (
int i = 0;
i < CommentStatistic::kMaxComments;
i++) {
131 comments_statistics[
i].Clear();
133 comments_statistics[CommentStatistic::kMaxComments].comment =
"Unknown";
134 comments_statistics[CommentStatistic::kMaxComments].size = 0;
135 comments_statistics[CommentStatistic::kMaxComments].count = 0;
140 void CodeStatistics::EnterComment(Isolate* isolate,
const char* comment,
142 CommentStatistic* comments_statistics =
143 isolate->paged_space_comments_statistics();
145 if (delta <= 0)
return;
146 CommentStatistic* cs = &comments_statistics[CommentStatistic::kMaxComments];
149 for (
int i = 0;
i < CommentStatistic::kMaxComments;
i++) {
150 if (comments_statistics[
i].comment ==
nullptr) {
151 cs = &comments_statistics[
i];
152 cs->comment = comment;
154 }
else if (strcmp(comments_statistics[
i].comment, comment) == 0) {
155 cs = &comments_statistics[
i];
166 void CodeStatistics::CollectCommentStatistics(Isolate* isolate,
169 DCHECK(it->rinfo()->rmode() == RelocInfo::COMMENT);
170 const char* tmp =
reinterpret_cast<const char*
>(it->rinfo()->data());
177 const char*
const comment_txt =
178 reinterpret_cast<const char*
>(it->rinfo()->data());
179 Address prev_pc = it->rinfo()->pc();
186 if (it->rinfo()->rmode() == RelocInfo::COMMENT) {
187 const char*
const txt =
188 reinterpret_cast<const char*
>(it->rinfo()->data());
189 flat_delta +=
static_cast<int>(it->rinfo()->pc() - prev_pc);
190 if (txt[0] ==
']')
break;
192 CollectCommentStatistics(isolate, it);
194 prev_pc = it->rinfo()->pc();
198 EnterComment(isolate, comment_txt, flat_delta);
202 void CodeStatistics::CollectCodeCommentStatistics(HeapObject* obj,
206 if (!obj->IsCode()) {
210 Code code = Code::cast(obj);
211 RelocIterator it(code);
213 Address prev_pc = code->raw_instruction_start();
215 if (it.rinfo()->rmode() == RelocInfo::COMMENT) {
216 delta +=
static_cast<int>(it.rinfo()->pc() - prev_pc);
217 CollectCommentStatistics(isolate, &it);
218 prev_pc = it.rinfo()->pc();
223 DCHECK(code->raw_instruction_start() <= prev_pc &&
224 prev_pc <= code->raw_instruction_end());
225 delta +=
static_cast<int>(code->raw_instruction_end() - prev_pc);
226 EnterComment(isolate,
"NoComment", delta);