[RunHandler] Minor optimizations to environment variable handling.

1. Avoid re-evaluating the "TF_RUN_HANDLER_USE_SUB_THREAD_POOL" environment variable each time a task is enqueued, by caching the result in a static local variable.
2. A similar optimization in `ChooseRequestsWithExponentialDistribution()`.
3. Since all the arguments are string literals, we can pass `const char*` to the `ParamFromEnv*WithDefault()` methods, to avoid creating a temporary `std::string` on each call.

PiperOrigin-RevId: 308915732
Change-Id: I1642b5d924477eb006497acf95ac7cfc17956feb
diff --git a/tensorflow/core/framework/run_handler.cc b/tensorflow/core/framework/run_handler.cc
index c0ab50f..bf3b14a 100644
--- a/tensorflow/core/framework/run_handler.cc
+++ b/tensorflow/core/framework/run_handler.cc
@@ -167,7 +167,7 @@
   }
 
   Waiter* w = nullptr;
-  bool use_sub_thread_pool =
+  static const bool use_sub_thread_pool =
       ParamFromEnvBoolWithDefault("TF_RUN_HANDLER_USE_SUB_THREAD_POOL", false);
 
   Waiter* waiter_queue;
@@ -424,7 +424,8 @@
     // thread_work_sources are order as start_request_idx, 0, 2, 4 ... 1, 3,
     // 5... for half of the threads and start_request_idx, 1, 3, 5 ... 0, 2,
     // 4... for the other half of the threads.
-    int num_shards = ParamFromEnvWithDefault("TF_RUN_HANDLER_QUEUE_SHARDS", 1);
+    static const int num_shards =
+        ParamFromEnvWithDefault("TF_RUN_HANDLER_QUEUE_SHARDS", 1);
     int token = tid % num_shards;
     for (int i = 0; i < num_shards; ++i) {
       for (int j = token; j < thread_work_sources.size(); j += num_shards) {
diff --git a/tensorflow/core/framework/run_handler_util.cc b/tensorflow/core/framework/run_handler_util.cc
index c832a64..932fb4a 100644
--- a/tensorflow/core/framework/run_handler_util.cc
+++ b/tensorflow/core/framework/run_handler_util.cc
@@ -23,16 +23,15 @@
 
 namespace tensorflow {
 
-double ParamFromEnvWithDefault(const std::string& var_name,
-                               double default_value) {
-  const char* val = std::getenv(var_name.c_str());
+double ParamFromEnvWithDefault(const char* var_name, double default_value) {
+  const char* val = std::getenv(var_name);
   double num;
   return (val && strings::safe_strtod(val, &num)) ? num : default_value;
 }
 
-std::vector<double> ParamFromEnvWithDefault(const std::string& var_name,
+std::vector<double> ParamFromEnvWithDefault(const char* var_name,
                                             std::vector<double> default_value) {
-  const char* val = std::getenv(var_name.c_str());
+  const char* val = std::getenv(var_name);
   if (!val) {
     return default_value;
   }
@@ -51,9 +50,9 @@
   return result;
 }
 
-std::vector<int> ParamFromEnvWithDefault(const std::string& var_name,
+std::vector<int> ParamFromEnvWithDefault(const char* var_name,
                                          std::vector<int> default_value) {
-  const char* val = std::getenv(var_name.c_str());
+  const char* val = std::getenv(var_name);
   if (!val) {
     return default_value;
   }
@@ -72,9 +71,8 @@
   return result;
 }
 
-bool ParamFromEnvBoolWithDefault(const std::string& var_name,
-                                 bool default_value) {
-  const char* val = std::getenv(var_name.c_str());
+bool ParamFromEnvBoolWithDefault(const char* var_name, bool default_value) {
+  const char* val = std::getenv(var_name);
   return (val) ? str_util::Lowercase(val) == "true" : default_value;
 }
 
@@ -148,19 +146,20 @@
   static const double kPowerBase =
       ParamFromEnvWithDefault("TF_RUN_HANDLER_EXP_DIST_POWER_BASE", 2.0);
 
+  static const int kMinEvenThreadsFromEnv = static_cast<int>(
+      ParamFromEnvWithDefault("TF_RUN_HANDLER_EXP_DIST_MIN_EVEN_THREADS", 1));
+  static const int kMaxEvenThreadsFromEnv = static_cast<int>(
+      ParamFromEnvWithDefault("TF_RUN_HANDLER_EXP_DIST_MAX_EVEN_THREADS", 3));
+
   std::vector<int> request_idx_list;
   request_idx_list.resize(num_threads);
   // Each request gets at least this number of threads that steal from it first.
   int min_threads_per_request =
       num_threads * kCapacityFractionForEvenDistribution / num_active_requests;
   min_threads_per_request =
-      std::max(static_cast<int>(ParamFromEnvWithDefault(
-                   "TF_RUN_HANDLER_EXP_DIST_MIN_EVEN_THREADS", 1)),
-               min_threads_per_request);
+      std::max(kMinEvenThreadsFromEnv, min_threads_per_request);
   min_threads_per_request =
-      std::min(static_cast<int>(ParamFromEnvWithDefault(
-                   "TF_RUN_HANDLER_EXP_DIST_MAX_EVEN_THREADS", 3)),
-               min_threads_per_request);
+      std::min(kMaxEvenThreadsFromEnv, min_threads_per_request);
 
   int num_remaining_threads =
       std::max(0, num_threads - num_active_requests * min_threads_per_request);
diff --git a/tensorflow/core/framework/run_handler_util.h b/tensorflow/core/framework/run_handler_util.h
index 982f06f..c63583d 100644
--- a/tensorflow/core/framework/run_handler_util.h
+++ b/tensorflow/core/framework/run_handler_util.h
@@ -56,25 +56,23 @@
 
 // Look up environment variable named 'var_name' and return the value if it
 // exist and can be parsed. Return 'default_value' otherwise.
-double ParamFromEnvWithDefault(const std::string& var_name,
-                               double default_value);
+double ParamFromEnvWithDefault(const char* var_name, double default_value);
 
 // Look up environment variable named 'var_name' and return the value if it
 // exist and can be parsed. The value must be in format val1,val2... Return
 // 'default_value' otherwise.
-std::vector<double> ParamFromEnvWithDefault(const std::string& var_name,
+std::vector<double> ParamFromEnvWithDefault(const char* var_name,
                                             std::vector<double> default_value);
 
 // Look up environment variable named 'var_name' and return the value if it
 // exist and can be parsed. The value must be in format val1,val2... Return
 // 'default_value' otherwise.
-std::vector<int> ParamFromEnvWithDefault(const std::string& var_name,
+std::vector<int> ParamFromEnvWithDefault(const char* var_name,
                                          std::vector<int> default_value);
 
 // Look up environment variable named 'var_name' and return the value if it
 // exist and can be parsed. Return 'default_value' otherwise.
-bool ParamFromEnvBoolWithDefault(const std::string& var_name,
-                                 bool default_value);
+bool ParamFromEnvBoolWithDefault(const char* var_name, bool default_value);
 
 }  // end namespace tensorflow
 #endif  // TENSORFLOW_CORE_FRAMEWORK_RUN_HANDLER_UTIL_H_