From 6bc43256c6f9891c6b0dc552a054fe0a4eda26dd Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 19 Oct 2019 12:16:31 -0700 Subject: [PATCH] Caching profile inspection results --- custom/4coder_profile_inspect.cpp | 132 +++++++++++++++------------- custom/4coder_profile_inspect.h | 8 ++ custom/4coder_search.cpp | 1 + custom/generated/command_metadata.h | 2 +- 4 files changed, 82 insertions(+), 61 deletions(-) diff --git a/custom/4coder_profile_inspect.cpp b/custom/4coder_profile_inspect.cpp index 6b3a9967..9436951d 100644 --- a/custom/4coder_profile_inspect.cpp +++ b/custom/4coder_profile_inspect.cpp @@ -74,6 +74,66 @@ sort_universal_slots(Profile_Universal_Slot **slots, i32 first, i32 one_past_las } } +function Profile_Inspection +profile_inspect(Arena *arena, Profile_History *history){ + Profile_Inspection inspect = {}; + for (Profile_Group *node = history->first; + node != 0; + node = node->next){ + i32 thread_id = node->thread_id; + Profile_Thread *column = get_column_from_thread_id(inspect.thread_first, + thread_id); + if (column == 0){ + column = push_array_zero(arena, Profile_Thread, 1); + sll_queue_push(inspect.thread_first, inspect.thread_last, column); + inspect.thread_count += 1; + column->thread_id = thread_id; + } + + Profile_Group_Ptr *ptr = push_array(arena, Profile_Group_Ptr, 1); + sll_queue_push(column->first_group, column->last_group, ptr); + ptr->group = node; + + String_Const_u8 source_location = node->source_location; + for (Profile_Record *record = node->first; + record != 0; + record = record->next){ + Profile_Universal_Slot *univ_slot = + get_universal_slot(column, source_location, record->slot_index); + if (univ_slot == 0){ + univ_slot = push_array(arena, Profile_Universal_Slot, 1); + sll_queue_push(column->first_slot, column->last_slot, univ_slot); + column->slot_count += 1; + univ_slot->source_location = source_location; + univ_slot->slot_index = record->slot_index; + univ_slot->name = node->slot_names[univ_slot->slot_index]; + univ_slot->count = 0; + univ_slot->total_time = 0; + } + univ_slot->count += 1; + univ_slot->total_time += record->time; + } + } + + for (Profile_Thread *column = inspect.thread_first; + column != 0; + column = column->next){ + i32 count = column->slot_count; + Profile_Universal_Slot **slots = push_array(arena, Profile_Universal_Slot*, count); + column->sorted_slots = slots; + i32 counter = 0; + for (Profile_Universal_Slot *node = column->first_slot; + node != 0; + node = node->next){ + slots[counter] = node; + counter += 1; + } + sort_universal_slots(slots, 0, count); + } + + return(inspect); +} + function void profile_render(Application_Links *app, Frame_Info frame_info, View_ID view){ Scratch_Block scratch(app); @@ -89,64 +149,9 @@ profile_render(Application_Links *app, Frame_Info frame_info, View_ID view){ system_mutex_acquire(profile_history.mutex); - // TODO(allen): cache this result! - Profile_Thread *thread_first = 0; - Profile_Thread *thread_last = 0; - i32 thread_count = 0; - for (Profile_Group *node = profile_history.first; - node != 0; - node = node->next){ - i32 thread_id = node->thread_id; - Profile_Thread *column = get_column_from_thread_id(thread_first, thread_id); - if (column == 0){ - column = push_array_zero(scratch, Profile_Thread, 1); - sll_queue_push(thread_first, thread_last, column); - thread_count += 1; - column->thread_id = thread_id; - } - - Profile_Group_Ptr *ptr = push_array(scratch, Profile_Group_Ptr, 1); - sll_queue_push(column->first_group, column->last_group, ptr); - ptr->group = node; - - String_Const_u8 source_location = node->source_location; - for (Profile_Record *record = node->first; - record != 0; - record = record->next){ - Profile_Universal_Slot *univ_slot = - get_universal_slot(column, source_location, record->slot_index); - if (univ_slot == 0){ - univ_slot = push_array(scratch, Profile_Universal_Slot, 1); - sll_queue_push(column->first_slot, column->last_slot, univ_slot); - column->slot_count += 1; - univ_slot->source_location = source_location; - univ_slot->slot_index = record->slot_index; - univ_slot->name = node->slot_names[univ_slot->slot_index]; - univ_slot->count = 0; - univ_slot->total_time = 0; - } - univ_slot->count += 1; - univ_slot->total_time += record->time; - } - } + Profile_Inspection inspect = global_profile_inspection; - for (Profile_Thread *column = thread_first; - column != 0; - column = column->next){ - i32 count = column->slot_count; - Profile_Universal_Slot **slots = push_array(scratch, Profile_Universal_Slot*, count); - column->sorted_slots = slots; - i32 counter = 0; - for (Profile_Universal_Slot *node = column->first_slot; - node != 0; - node = node->next){ - slots[counter] = node; - counter += 1; - } - sort_universal_slots(slots, 0, count); - } - - f32 column_width = rect_width(region)/(f32)thread_count; + f32 column_width = rect_width(region)/(f32)inspect.thread_count; Rect_f32_Pair header_body = rect_split_top_bottom(region, block_height); @@ -155,7 +160,7 @@ profile_render(Application_Links *app, Frame_Info frame_info, View_ID view){ Range_f32 body_y = rect_range_y(header_body.max); f32 pos_x = region.x0; - for (Profile_Thread *column = thread_first; + for (Profile_Thread *column = inspect.thread_first; column != 0; column = column->next){ Range_f32 column_x = If32_size(pos_x, column_width); @@ -273,14 +278,21 @@ profile_render(Application_Links *app, Frame_Info frame_info, View_ID view){ CUSTOM_COMMAND_SIG(profile_inspect) CUSTOM_DOC("Inspect all currently collected profiling information in 4coder's self profiler.") { + if (HasFlag(profile_history.disable_bits, ProfileEnable_InspectBit)){ + return; + } + + profile_history_set_enabled(false, ProfileEnable_InspectBit); + + Scratch_Block scratch(app); + global_profile_inspection = profile_inspect(scratch, &profile_history); + View_ID view = get_active_view(app, Access_Always); View_Context ctx = view_current_context(app, view); ctx.render_caller = profile_render; ctx.hides_buffer = true; view_push_context(app, view, &ctx); - profile_history_set_enabled(false, ProfileEnable_InspectBit); - for (;;){ User_Input in = get_next_input(app, EventPropertyGroup_Any, EventProperty_Escape); if (in.abort){ diff --git a/custom/4coder_profile_inspect.h b/custom/4coder_profile_inspect.h index a271f621..3fbccdb5 100644 --- a/custom/4coder_profile_inspect.h +++ b/custom/4coder_profile_inspect.h @@ -38,6 +38,14 @@ struct Profile_Thread{ Profile_Universal_Slot **sorted_slots; }; +struct Profile_Inspection{ + Profile_Thread *thread_first; + Profile_Thread *thread_last; + i32 thread_count; +}; + +global Profile_Inspection global_profile_inspection = {}; + #endif // TOP diff --git a/custom/4coder_search.cpp b/custom/4coder_search.cpp index d9b3c49c..eb75995d 100644 --- a/custom/4coder_search.cpp +++ b/custom/4coder_search.cpp @@ -429,6 +429,7 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with String_Const_u8 str = word_complete_it_read(&state.it); buffer_replace_range(app, buffer, state.range, str); + state.range.max = state.range.min + str.size; view_set_cursor_and_preferred_x(app, view, seek_pos(state.range.max)); } diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 369248fa..4eaddd64 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -440,7 +440,7 @@ static Command_Metadata fcoder_metacmd_table[211] = { { PROC_LINKS(miblo_decrement_time_stamp, 0), "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, { PROC_LINKS(miblo_increment_time_stamp_minute, 0), "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 }, { PROC_LINKS(miblo_decrement_time_stamp_minute, 0), "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, -{ PROC_LINKS(profile_inspect, 0), "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "w:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 273 }, +{ PROC_LINKS(profile_inspect, 0), "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "w:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 278 }, { PROC_LINKS(default_startup, 0), "default_startup", 15, "Default command for responding to a startup event", 49, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, { PROC_LINKS(default_try_exit, 0), "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 21 }, };