diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-11-05-19-44-32.gh-issue-116772.jC4dMr.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-05-19-44-32.gh-issue-116772.jC4dMr.rst new file mode 100644 index 00000000000000..075f06072e786f --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-05-19-44-32.gh-issue-116772.jC4dMr.rst @@ -0,0 +1,2 @@ +Cache ``getenv`` result in optimizer.c to reduce redundant calls during +optimization diff --git a/Python/optimizer.c b/Python/optimizer.c index f8d0aa04b9e003..fa8a39fc19ad44 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1200,6 +1200,28 @@ int effective_trace_length(_PyUOpInstruction *buffer, int length) } #endif +static bool uops_optimize_initialized = false; +static bool uops_optimize_flag = false; + +static void +initialize_uops_optimize_flag(void) { + if (!uops_optimize_initialized) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + char *env_var = Py_GETENV("PYTHON_UOPS_OPTIMIZE"); + bool uops_optimize_flag = (env_var == NULL || *env_var == '\0' || *env_var > '0'); + if (interp != NULL) { + interp->uops_optimize_flag = uops_optimize_flag; + } + uops_optimize_initialized = true; + } + else { + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (interp != NULL) { + uops_optimize_flag = interp->uops_optimize_flag; + } + } +} + static int uop_optimize( _PyInterpreterFrame *frame, @@ -1208,6 +1230,8 @@ uop_optimize( int curr_stackentries, bool progress_needed) { + initialize_uops_optimize_flag(); + _PyBloomFilter dependencies; _Py_BloomFilter_Init(&dependencies); _PyUOpInstruction buffer[UOP_MAX_TRACE_LENGTH]; @@ -1219,8 +1243,7 @@ uop_optimize( } assert(length < UOP_MAX_TRACE_LENGTH); OPT_STAT_INC(traces_created); - char *env_var = Py_GETENV("PYTHON_UOPS_OPTIMIZE"); - if (env_var == NULL || *env_var == '\0' || *env_var > '0') { + if (uops_optimize_flag) { length = _Py_uop_analyze_and_optimize(frame, buffer, length, curr_stackentries, &dependencies);