From 95031f508b12e533e8541827f2d9a70c74c6c8d9 Mon Sep 17 00:00:00 2001 From: Sidi Liang <1467329765@qq.com> Date: Sun, 3 Nov 2024 17:30:26 +0800 Subject: [PATCH] [web] Added an option to display execution time --- src/nasal_web.cpp | 31 +++++++++++++++++++++++++------ src/nasal_web.h | 7 +++++-- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/nasal_web.cpp b/src/nasal_web.cpp index e1c9f2a..4925f8e 100644 --- a/src/nasal_web.cpp +++ b/src/nasal_web.cpp @@ -13,6 +13,7 @@ #include #include #include +#include struct NasalContext { std::unique_ptr vm_instance; @@ -32,7 +33,10 @@ void nasal_cleanup(void* context) { delete static_cast(context); } -const char* nasal_eval(void* context, const char* code) { +const char* nasal_eval(void* context, const char* code, int show_time) { + using clk = std::chrono::high_resolution_clock; + const auto den = clk::duration::period::den; + auto* ctx = static_cast(context); try { @@ -89,16 +93,31 @@ const char* nasal_eval(void* context, const char* code) { opt->do_optimization(parse.tree()); gen.compile(parse, ld, false, true).chkerr(); // enable limit_mode for safety - // Run the code + // Run the code with optional timing + const auto start = show_time ? clk::now() : clk::time_point(); ctx->vm_instance->run(gen, ld, {}); - + const auto end = show_time ? clk::now() : clk::time_point(); + // Restore stdout and stderr and get the outputs std::cout.rdbuf(old_cout); std::cerr.rdbuf(old_cerr); - ctx->last_result = output.str() + error_output.str(); - if (ctx->last_result.empty()) { - ctx->last_result = "Execution completed successfully."; + + std::stringstream result; + result << output.str(); + if (!error_output.str().empty()) { + result << error_output.str(); } + if (result.str().empty()) { + result << "Execution completed successfully.\n"; + } + + // Add execution time if requested + if (show_time) { + double execution_time = static_cast((end-start).count())/den; + result << "\nExecution time: " << execution_time << "s"; + } + + ctx->last_result = result.str(); // Remove the temporary file std::remove(temp_filename); diff --git a/src/nasal_web.h b/src/nasal_web.h index f3c5eb5..63a734b 100644 --- a/src/nasal_web.h +++ b/src/nasal_web.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef __NASAL_WEB_H__ +#define __NASAL_WEB_H__ #include "nasal.h" @@ -15,9 +16,11 @@ extern "C" { // Main API functions NASAL_EXPORT void* nasal_init(); NASAL_EXPORT void nasal_cleanup(void* context); -NASAL_EXPORT const char* nasal_eval(void* context, const char* code); +NASAL_EXPORT const char* nasal_eval(void* context, const char* code, int show_time); NASAL_EXPORT const char* nasal_get_error(void* context); #ifdef __cplusplus } #endif + +#endif