add profiler timeout
This commit is contained in:
parent
bcad975c71
commit
f82c54d3b2
|
@ -33,10 +33,10 @@ profile.cpu = function profile_cpu(fn, times = 1, q = "unnamed") {
|
||||||
profile.start_prof_gather();
|
profile.start_prof_gather();
|
||||||
}
|
}
|
||||||
|
|
||||||
profile.ms = function(t) { return t/1000000; }
|
profile.ms = function(t) { return profile.secs(t)*1000; }
|
||||||
profile.secs = function(t) { return t/1000000000; }
|
|
||||||
|
|
||||||
var callgraph = {};
|
var callgraph = {};
|
||||||
|
profile.cpu_cg = callgraph;
|
||||||
var st = profile.now();
|
var st = profile.now();
|
||||||
|
|
||||||
function add_callgraph(fn, line, time) {
|
function add_callgraph(fn, line, time) {
|
||||||
|
@ -53,16 +53,17 @@ function add_callgraph(fn, line, time) {
|
||||||
cc.hits++;
|
cc.hits++;
|
||||||
}
|
}
|
||||||
|
|
||||||
var hittar = 500;
|
var hittar = 500; // number of call instructions before getting a new frame
|
||||||
var hitpct = 0.2;
|
var hitpct = 0.2; // amount to randomize it
|
||||||
var start_gather = profile.now();
|
var start_gather = profile.now();
|
||||||
|
|
||||||
var gathering_cpu = false;
|
var cpu_start;
|
||||||
|
|
||||||
profile.start_cpu_gather = function()
|
profile.start_cpu_gather = function(gathertime = 5) // gather cpu frames for 'time' seconds
|
||||||
{
|
{
|
||||||
if (gathering_cpu) return;
|
if (cpu_start) return;
|
||||||
gathering_cpu = true;
|
cpu_start = profile.now();
|
||||||
|
|
||||||
profile.gather(hittar, function() {
|
profile.gather(hittar, function() {
|
||||||
var time = profile.now()-st;
|
var time = profile.now()-st;
|
||||||
|
|
||||||
|
@ -80,8 +81,26 @@ profile.start_cpu_gather = function()
|
||||||
add_callgraph(fns[i], lines[i], time);
|
add_callgraph(fns[i], lines[i], time);
|
||||||
|
|
||||||
st = profile.now();
|
st = profile.now();
|
||||||
|
if (profile.secs(st-cpu_start) < gathertime)
|
||||||
profile.gather_rate(Math.variate(hittar,hitpct));
|
profile.gather_rate(Math.variate(hittar,hitpct));
|
||||||
|
else {
|
||||||
|
profile.gather_stop();
|
||||||
|
cpu_start = undefined;
|
||||||
|
var e = Object.values(callgraph);
|
||||||
|
e = e.sort((a,b) => {
|
||||||
|
if (a.time > b.time) return -1;
|
||||||
|
return 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
for (var x of e) {
|
||||||
|
var ffs = x.line.split(':');
|
||||||
|
var time = profile.best_t(x.time);
|
||||||
|
var pct = profile.secs(x.time)/gathertime*100;
|
||||||
|
x.log =`${x.line}::${x.fn}:: ${time} (${pct.toPrecision(3)}%) (${x.hits} hits) --> ${get_line(ffs[0], ffs[1])}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
profile.cpu_instr = e;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,8 +144,6 @@ function get_line(file, line) {
|
||||||
|
|
||||||
profile.stop_cpu_instr = function()
|
profile.stop_cpu_instr = function()
|
||||||
{
|
{
|
||||||
if (!gathering_cpu) return;
|
|
||||||
|
|
||||||
say("===CPU INSTRUMENTATION===\n");
|
say("===CPU INSTRUMENTATION===\n");
|
||||||
var gather_time = profile.now()-start_gather;
|
var gather_time = profile.now()-start_gather;
|
||||||
var e = Object.values(callgraph);
|
var e = Object.values(callgraph);
|
||||||
|
@ -156,13 +173,17 @@ profile.best_t = function (t) {
|
||||||
|
|
||||||
profile.report = function (start, msg = "[undefined report]") { console.info(`${msg} in ${profile.best_t(profile.now() - start)}`); };
|
profile.report = function (start, msg = "[undefined report]") { console.info(`${msg} in ${profile.best_t(profile.now() - start)}`); };
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Frame averages are an instrumented profiling technique. Place frame() calls in your code to get a call graph for things you are interested in.
|
||||||
|
*/
|
||||||
|
|
||||||
var frame_avg = false;
|
var frame_avg = false;
|
||||||
profile.frame_avg_t = 72000;
|
profile.frame_avg_t = 72000;
|
||||||
|
|
||||||
profile.start_frame_avg = function()
|
profile.start_frame_avg = function()
|
||||||
{
|
{
|
||||||
if (frame_avg) return;
|
if (frame_avg) return;
|
||||||
say("===STARTING FRAME AVERAGE MEASUREMENTS===");
|
|
||||||
profile_frames = {};
|
profile_frames = {};
|
||||||
profile_frame_ts = [];
|
profile_frame_ts = [];
|
||||||
profile_cframe = profile_frames;
|
profile_cframe = profile_frames;
|
||||||
|
@ -239,6 +260,12 @@ profile.print_frame_avg = function()
|
||||||
say("\n");
|
say("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Cache reporting is to measure how long specific events take, that are NOT every frame
|
||||||
|
Useful to measure things like how long it takes to make a specific creature
|
||||||
|
*/
|
||||||
|
|
||||||
var cache_reporting = false;
|
var cache_reporting = false;
|
||||||
|
|
||||||
var report_cache = {};
|
var report_cache = {};
|
||||||
|
@ -247,11 +274,6 @@ var cachest = 0;
|
||||||
var cachegroup;
|
var cachegroup;
|
||||||
var cachetitle;
|
var cachetitle;
|
||||||
|
|
||||||
profile.imgui = function()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
profile.cache_reporting = function() { return cache_reporting; }
|
profile.cache_reporting = function() { return cache_reporting; }
|
||||||
profile.cache_toggle = function() { cache_reporting = !cache_reporting; }
|
profile.cache_toggle = function() { cache_reporting = !cache_reporting; }
|
||||||
profile.cache_dump = function() {
|
profile.cache_dump = function() {
|
||||||
|
|
|
@ -111,7 +111,7 @@ JSC_SCALL(imgui_text, ImGui::Text(str) )
|
||||||
|
|
||||||
JSC_SCALL(imgui_button,
|
JSC_SCALL(imgui_button,
|
||||||
if (ImGui::Button(str))
|
if (ImGui::Button(str))
|
||||||
script_call_sym(argv[1], 1, argv);
|
script_call_sym(argv[1], 0, NULL);
|
||||||
)
|
)
|
||||||
|
|
||||||
JSC_CCALL(imgui_sokol_gfx,
|
JSC_CCALL(imgui_sokol_gfx,
|
||||||
|
@ -228,7 +228,7 @@ JSC_SCALL(imgui_imagebutton,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::ImageButton(str, simgui_imtextureid(tex->simgui), ImVec2(tex->width, tex->height)))
|
if (ImGui::ImageButton(str, simgui_imtextureid(tex->simgui), ImVec2(tex->width, tex->height)))
|
||||||
script_call_sym(argv[2], 1, argv);
|
script_call_sym(argv[2], 0, NULL);
|
||||||
)
|
)
|
||||||
|
|
||||||
JSC_CCALL(imgui_sameline, ImGui::SameLine(js2number(argv[0])) )
|
JSC_CCALL(imgui_sameline, ImGui::SameLine(js2number(argv[0])) )
|
||||||
|
|
|
@ -1720,11 +1720,14 @@ JSC_CCALL(profile_gather_stop,
|
||||||
JS_SetInterruptHandler(rt,NULL,NULL);
|
JS_SetInterruptHandler(rt,NULL,NULL);
|
||||||
)
|
)
|
||||||
|
|
||||||
|
JSC_CCALL(profile_secs, return number2js(stm_sec(js2number(argv[0]))); )
|
||||||
|
|
||||||
static const JSCFunctionListEntry js_profile_funcs[] = {
|
static const JSCFunctionListEntry js_profile_funcs[] = {
|
||||||
MIST_FUNC_DEF(profile,now,0),
|
MIST_FUNC_DEF(profile,now,0),
|
||||||
MIST_FUNC_DEF(profile,gather,2),
|
MIST_FUNC_DEF(profile,gather,2),
|
||||||
MIST_FUNC_DEF(profile,gather_rate,1),
|
MIST_FUNC_DEF(profile,gather_rate,1),
|
||||||
MIST_FUNC_DEF(profile,gather_stop,0),
|
MIST_FUNC_DEF(profile,gather_stop,0),
|
||||||
|
MIST_FUNC_DEF(profile,secs,1),
|
||||||
};
|
};
|
||||||
|
|
||||||
JSC_SCALL(io_exists, ret = boolean2js(fexists(str)))
|
JSC_SCALL(io_exists, ret = boolean2js(fexists(str)))
|
||||||
|
|
Loading…
Reference in a new issue