diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh
index 59d65a9276940115ee2e084b1b9ffffa2e39eb01..829c2e30405f04b3cc8c42b82d5bf88fcd1d42d1 100755
--- a/tools/run_tests/performance/build_performance.sh
+++ b/tools/run_tests/performance/build_performance.sh
@@ -36,14 +36,17 @@ cd $(dirname $0)/../../..
 
 CONFIG=${CONFIG:-opt}
 
-# build C++ qps worker & driver
-# TODO(jtattermusch): not embedding OpenSSL breaks the C# build because
-# grpc_csharp_ext needs OpenSSL embedded and some intermediate files from
-# this build will be reused.
-make CONFIG=${CONFIG} EMBED_OPENSSL=true EMBED_ZLIB=true qps_worker qps_driver -j8
+for language in $@
+do
+  if [ "$language" == "c++" ]
+  then
+    # build C++ qps worker & driver
+    # TODO(jtattermusch): not embedding OpenSSL breaks the C# build because
+    # grpc_csharp_ext needs OpenSSL embedded and some intermediate files from
+    # this build will be reused.
+    make CONFIG=${CONFIG} EMBED_OPENSSL=true EMBED_ZLIB=true qps_worker qps_driver -j8
+  else
+    tools/run_tests/run_tests.py -l $language -c $CONFIG --build_only -j 8
+  fi
+done
 
-# build C# qps worker
-tools/run_tests/run_tests.py -l csharp -c $CONFIG --build_only -j 8
-
-# build Node qps worker
-tools/run_tests/run_tests.py -l node -c $CONFIG --build_only -j 8
diff --git a/tools/run_tests/performance/remote_host_build.sh b/tools/run_tests/performance/remote_host_build.sh
index f23ea921ce38d98591f9b24e77d92b7027371bb2..fee4167d3321345bcdabc35ab2aaf0cca623a262 100755
--- a/tools/run_tests/performance/remote_host_build.sh
+++ b/tools/run_tests/performance/remote_host_build.sh
@@ -33,4 +33,4 @@ set -ex
 cd $(dirname $0)/../../..
 
 # execute the build script remotely
-ssh "${USER_AT_HOST}" "CONFIG=${CONFIG} ~/performance_workspace/grpc/tools/run_tests/performance/build_performance.sh"
+ssh "${USER_AT_HOST}" "CONFIG=${CONFIG} ~/performance_workspace/grpc/tools/run_tests/performance/build_performance.sh $*"
diff --git a/tools/run_tests/run_performance_tests.py b/tools/run_tests/run_performance_tests.py
index cf6b3929366746749044b3e7c7cc99e1bb79cbe2..0ab3d264a59a2f4eb64ba2b4471dd823ee6ddd57 100755
--- a/tools/run_tests/run_performance_tests.py
+++ b/tools/run_tests/run_performance_tests.py
@@ -272,7 +272,7 @@ def prepare_remote_hosts(hosts):
     sys.exit(1)
 
 
-def build_on_remote_hosts(hosts, build_local=False):
+def build_on_remote_hosts(hosts, languages=_LANGUAGES.keys(), build_local=False):
   """Builds performance worker on remote hosts (and maybe also locally)."""
   build_timeout = 15*60
   build_jobs = []
@@ -280,7 +280,7 @@ def build_on_remote_hosts(hosts, build_local=False):
     user_at_host = '%s@%s' % (_REMOTE_HOST_USERNAME, host)
     build_jobs.append(
         jobset.JobSpec(
-            cmdline=['tools/run_tests/performance/remote_host_build.sh'],
+            cmdline=['tools/run_tests/performance/remote_host_build.sh'] + languages,
             shortname='remote_host_build.%s' % host,
             environ = {'USER_AT_HOST': user_at_host, 'CONFIG': 'opt'},
             timeout_seconds=build_timeout))
@@ -288,7 +288,7 @@ def build_on_remote_hosts(hosts, build_local=False):
     # Build locally as well
     build_jobs.append(
         jobset.JobSpec(
-            cmdline=['tools/run_tests/performance/build_performance.sh'],
+            cmdline=['tools/run_tests/performance/build_performance.sh'] + languages,
             shortname='local_build',
             environ = {'CONFIG': 'opt'},
             timeout_seconds=build_timeout))
@@ -400,7 +400,7 @@ if remote_hosts:
 build_local = False
 if not args.remote_driver_host:
   build_local = True
-build_on_remote_hosts(remote_hosts, build_local=build_local)
+build_on_remote_hosts(remote_hosts, languages=[str(l) for l in languages], build_local=build_local)
 
 qpsworker_jobs = start_qpsworkers(languages, args.remote_worker_host)