From 537431e61278e5fe374fd1b084fb424e84102634 Mon Sep 17 00:00:00 2001 From: Wulian Date: Tue, 5 Nov 2024 19:50:11 +0800 Subject: [PATCH 1/4] Cache getenv result in optimizer.c to reduce calls --- ...24-11-05-19-44-32.gh-issue-116772.jC4dMr.rst | 2 ++ Python/optimizer.c | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2024-11-05-19-44-32.gh-issue-116772.jC4dMr.rst 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 b876b6c2bd72fd..c1732d58f8fd62 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1225,6 +1225,9 @@ int effective_trace_length(_PyUOpInstruction *buffer, int length) } #endif +static int uop_optimize_initialized = 0; +static int uop_optimize_flag = 0; + static int uop_optimize( _PyOptimizerObject *self, @@ -1245,8 +1248,18 @@ 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 (!uop_optimize_initialized) { + char *env_var = Py_GETENV("PYTHON_UOPS_OPTIMIZE"); + if (env_var == NULL || *env_var == '\0' || *env_var > '0') { + uop_optimize_flag = 1; + } else { + uop_optimize_flag = 0; + } + uop_optimize_initialized = 1; + } + + if (uop_optimize_flag) { length = _Py_uop_analyze_and_optimize(frame, buffer, length, curr_stackentries, &dependencies); From 5c5929756582624fd5a185b019fad1d638136ab6 Mon Sep 17 00:00:00 2001 From: Wulian233 <1055917385@qq.com> Date: Tue, 29 Apr 2025 19:08:55 +0800 Subject: [PATCH 2/4] Update optimizer.c --- Python/optimizer.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Python/optimizer.c b/Python/optimizer.c index c1732d58f8fd62..eb001b4b2ac9d8 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1225,8 +1225,16 @@ int effective_trace_length(_PyUOpInstruction *buffer, int length) } #endif -static int uop_optimize_initialized = 0; -static int uop_optimize_flag = 0; +static void +initialize_uops_optimize_flag() { + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (!python_uops_optimize_initialized) { + char *env_var = Py_GETENV("PYTHON_UOPS_OPTIMIZE"); + interp->uops_optimize_flag = (env_var == NULL || *env_var == '\0' || *env_var > '0'); + uops_optimize_initialized = true; + } + uops_optimize_flag = interp->uops_optimize_flag; +} static int uop_optimize( @@ -1237,6 +1245,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]; @@ -1248,18 +1258,7 @@ uop_optimize( } assert(length < UOP_MAX_TRACE_LENGTH); OPT_STAT_INC(traces_created); - - if (!uop_optimize_initialized) { - char *env_var = Py_GETENV("PYTHON_UOPS_OPTIMIZE"); - if (env_var == NULL || *env_var == '\0' || *env_var > '0') { - uop_optimize_flag = 1; - } else { - uop_optimize_flag = 0; - } - uop_optimize_initialized = 1; - } - - if (uop_optimize_flag) { + if (uops_optimize_flag) { length = _Py_uop_analyze_and_optimize(frame, buffer, length, curr_stackentries, &dependencies); From f25a3576f67c25ddda228d672338e7a67d1fdae2 Mon Sep 17 00:00:00 2001 From: Wulian233 <1055917385@qq.com> Date: Tue, 29 Apr 2025 19:11:04 +0800 Subject: [PATCH 3/4] try fix --- Python/optimizer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/optimizer.c b/Python/optimizer.c index eb001b4b2ac9d8..79c346ea7e4c06 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1228,7 +1228,7 @@ int effective_trace_length(_PyUOpInstruction *buffer, int length) static void initialize_uops_optimize_flag() { PyInterpreterState *interp = _PyInterpreterState_GET(); - if (!python_uops_optimize_initialized) { + if (!uops_optimize_initialized) { char *env_var = Py_GETENV("PYTHON_UOPS_OPTIMIZE"); interp->uops_optimize_flag = (env_var == NULL || *env_var == '\0' || *env_var > '0'); uops_optimize_initialized = true; From acad35f3d37b672dddddf1a66ae972b1fd068d84 Mon Sep 17 00:00:00 2001 From: Wulian233 <1055917385@qq.com> Date: Tue, 29 Apr 2025 19:56:54 +0800 Subject: [PATCH 4/4] not safe WIP --- Python/optimizer.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Python/optimizer.c b/Python/optimizer.c index 23c3141df6cd0c..fa8a39fc19ad44 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1200,15 +1200,26 @@ 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() { - PyInterpreterState *interp = _PyInterpreterState_GET(); +initialize_uops_optimize_flag(void) { if (!uops_optimize_initialized) { + PyInterpreterState *interp = _PyInterpreterState_GET(); char *env_var = Py_GETENV("PYTHON_UOPS_OPTIMIZE"); - interp->uops_optimize_flag = (env_var == NULL || *env_var == '\0' || *env_var > '0'); + 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; } - uops_optimize_flag = interp->uops_optimize_flag; + else { + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (interp != NULL) { + uops_optimize_flag = interp->uops_optimize_flag; + } + } } static int