diff options
author | Steve Bennett <steveb@workware.net.au> | 2020-06-11 08:38:44 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2023-02-13 10:43:00 +1000 |
commit | 11775c0a3eb7edfb96e1c295426a73f31925deb0 (patch) | |
tree | c6235f0b3fcd90ad6563903ceb403119673f3199 | |
parent | 41c6cf3c120bd2b56e7593c22c9cb94f6d7c5b2c (diff) | |
download | jimtcl-11775c0a3eb7edfb96e1c295426a73f31925deb0.zip jimtcl-11775c0a3eb7edfb96e1c295426a73f31925deb0.tar.gz jimtcl-11775c0a3eb7edfb96e1c295426a73f31925deb0.tar.bz2 |
core: New timerate command
Based on TIP 527, but not 100% compatible
Needs documentation
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 66 |
1 files changed, 66 insertions, 0 deletions
@@ -14612,6 +14612,71 @@ static int Jim_TimeCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg return JIM_OK; } +/* [timerate] */ +static int Jim_TimeRateCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + long us = 0; + jim_wide start, delta, overhead; + Jim_Obj *objPtr; + double us_per_iter; + int count; + int n; + + if (argc < 2) { + Jim_WrongNumArgs(interp, 1, argv, "script ?milliseconds?"); + return JIM_ERR; + } + if (argc == 3) { + if (Jim_GetLong(interp, argv[2], &us) != JIM_OK) + return JIM_ERR; + us *= 1000; + } + if (us < 1) { + /* Default is 1 second */ + us = 1000 * 1000; + } + + /* Run until we exceed the time limit */ + start = JimClock(); + count = 0; + do { + int retval = Jim_EvalObj(interp, argv[1]); + delta = JimClock() - start; + if (retval != JIM_OK) { + return retval; + } + count++; + } while (delta < us); + + /* Now try to account for the loop and eval overhead */ + start = JimClock(); + n = 0; + do { + int retval = Jim_EvalObj(interp, interp->nullScriptObj); + overhead = JimClock() - start; + if (retval != JIM_OK) { + return retval; + } + n++; + } while (n < count); + + delta -= overhead; + + us_per_iter = (double)delta / count; + objPtr = Jim_NewListObj(interp, NULL, 0); + + Jim_ListAppendElement(interp, objPtr, Jim_NewStringObj(interp, "us_per_iter", -1)); + Jim_ListAppendElement(interp, objPtr, Jim_NewDoubleObj(interp, us_per_iter)); + Jim_ListAppendElement(interp, objPtr, Jim_NewStringObj(interp, "iters_per_sec", -1)); + Jim_ListAppendElement(interp, objPtr, Jim_NewDoubleObj(interp, 1e6 / us_per_iter)); + Jim_ListAppendElement(interp, objPtr, Jim_NewStringObj(interp, "count", -1)); + Jim_ListAppendElement(interp, objPtr, Jim_NewIntObj(interp, count)); + Jim_ListAppendElement(interp, objPtr, Jim_NewStringObj(interp, "elapsed_us", -1)); + Jim_ListAppendElement(interp, objPtr, Jim_NewIntObj(interp, delta)); + Jim_SetResult(interp, objPtr); + return JIM_OK; +} + /* [exit] */ static int Jim_ExitCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { @@ -16286,6 +16351,7 @@ static const struct { {"global", Jim_GlobalCoreCommand}, {"string", Jim_StringCoreCommand}, {"time", Jim_TimeCoreCommand}, + {"timerate", Jim_TimeRateCoreCommand}, {"exit", Jim_ExitCoreCommand}, {"catch", Jim_CatchCoreCommand}, {"try", Jim_TryCoreCommand}, |