|
|
@@ -14,11 +14,6 @@ static std::string to_string_1f(f64 x){
|
|
|
return buf;
|
|
|
}
|
|
|
|
|
|
-std::string_view LineRecord::line_content() const {
|
|
|
- auto [_0, _1] = src->_get_line(line);
|
|
|
- return std::string_view(_0, _1-_0);
|
|
|
-}
|
|
|
-
|
|
|
void LineProfiler::begin(){
|
|
|
prev_time = 0;
|
|
|
prev_record = nullptr;
|
|
|
@@ -43,7 +38,6 @@ void LineProfiler::_step(Frame *frame){
|
|
|
file_records.resize(total_lines + 1);
|
|
|
for(int i=1; i<=total_lines; i++){
|
|
|
file_records[i].line = i;
|
|
|
- file_records[i].src = frame->co->src.get();
|
|
|
}
|
|
|
}
|
|
|
prev_record = &file_records.at(line);
|
|
|
@@ -66,25 +60,33 @@ void LineProfiler::end(){
|
|
|
|
|
|
Str LineProfiler::stats(){
|
|
|
SStream ss;
|
|
|
- for(auto& [filename, file_records] : records){
|
|
|
+ for(FuncDecl* decl: functions){
|
|
|
+ int start_line = decl->code->start_line;
|
|
|
+ int end_line = decl->code->end_line;
|
|
|
+ if(start_line == -1 || end_line == -1) continue;
|
|
|
+ std::string_view filename = decl->code->src->filename.sv();
|
|
|
+ std::vector<LineRecord>& file_records = records[filename];
|
|
|
+ if(file_records.empty()) continue;
|
|
|
clock_t total_time = 0;
|
|
|
- for(auto& record: file_records){
|
|
|
- if(record.is_valid()) total_time += record.time;
|
|
|
+ for(int line = start_line; line <= end_line; line++){
|
|
|
+ total_time += file_records.at(line).time;
|
|
|
}
|
|
|
ss << "Total time: " << (f64)total_time / CLOCKS_PER_SEC << "s\n";
|
|
|
ss << "File: " << filename << "\n";
|
|
|
- // ss << "Function: " << "<?>" << "at line " << -1 << "\n";
|
|
|
+ ss << "Function: " << decl->code->name << " at line " << start_line << "\n";
|
|
|
ss << "Line # Hits Time Per Hit % Time Line Contents\n";
|
|
|
ss << "==============================================================\n";
|
|
|
- for(int line = 1; line < file_records.size(); line++){
|
|
|
- LineRecord& record = file_records[line];
|
|
|
- if(!record.is_valid() || record.hits == 0) continue;
|
|
|
+ for(int line = start_line; line <= end_line; line++){
|
|
|
+ const LineRecord& record = file_records.at(line);
|
|
|
+ if(!record.is_valid()) continue;
|
|
|
ss << left_pad(std::to_string(line), 6);
|
|
|
ss << left_pad(std::to_string(record.hits), 10);
|
|
|
- ss << left_pad(std::to_string(record.time), 13);
|
|
|
+ ss << left_pad(std::to_string(record.time / CLOCKS_PER_SEC), 13);
|
|
|
ss << left_pad(std::to_string(record.time / record.hits), 9);
|
|
|
ss << left_pad(to_string_1f(record.time * (f64)100 / total_time), 9);
|
|
|
- ss << " " << record.line_content() << "\n";
|
|
|
+ // line_content
|
|
|
+ auto [_0, _1] = decl->code->src->_get_line(line);
|
|
|
+ ss << " " << std::string_view(_0, _1-_0) << "\n";
|
|
|
}
|
|
|
ss << "\n";
|
|
|
}
|