commit 0fc61ddb1df72762d1e833c3977c4dd8e9c06617
Author: Damian Johnson <atagar(a)torproject.org>
Date: Fri Mar 1 11:13:10 2019 -0800
Skip autocompletion for non-interactive interpreter
Sadly I forget where it was pointed out, but invoking the control port via
shell is a *lot* faster than stem...
#!/bin/bash -e
cmd="$@"
pass="ControlPortPassword"
function test_tor() {
echo "$1" >&3
sed "/^250 OK\r$/q" <&3
echo QUIT >&3
exec 3<&-
}
exec 3<>/dev/tcp/127.0.0.1/9051
echo AUTHENTICATE \"$pass\" >&3
read -u 3
test_tor "$cmd"
====================
atagar@morrigan:~$ time ./bench.sh 'GETINFO version' 1>/dev/null
real 0m0.007s
user 0m0.004s
sys 0m0.003s
====================
atagar@morrigan:~$ time tor-prompt --run 'GETINFO version' 1>/dev/null
real 0m0.186s
user 0m0.072s
sys 0m0.030s
Generally speaking this is expected. Spinning up an interpreter takes time. But
in doing a quick investigation realized this is quite a bit slower than it
needs to be...
total tor-prompt runtime 0.186 seconds
--------------------------------------------------------
python interpreter startup 0.016 seconds (9%)
import statements 0.079 seconds (42%)
check if tor is running 0.014 seconds (8%)
connect to tor 0.009 seconds (5%)
autocompete setup 0.065 seconds (34%)
invoke tor controller command 0.003 seconds (2%)
Autocompletion is only relevant when the user is presented with an interactive
interpreter. If we're merely invoking a command it's pointless.
So TL;DR: tor-prompt is now ~34% faster when used to invoke controller commands.
---
docs/change_log.rst | 4 ++++
stem/interpreter/__init__.py | 10 +++++-----
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/docs/change_log.rst b/docs/change_log.rst
index edf574c3..21b6c85e 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -77,6 +77,10 @@ The following are only available within Stem's `git repository
* Added NetBSD to our `download page <download.html>`_
+ * **Interpreter**
+
+ * tor-prompt is now ~34% faster when used to non-interactively invoke commands
+
.. _version_1.7:
Version 1.7 (October 7th, 2018)
diff --git a/stem/interpreter/__init__.py b/stem/interpreter/__init__.py
index b10109e8..a4911a65 100644
--- a/stem/interpreter/__init__.py
+++ b/stem/interpreter/__init__.py
@@ -118,11 +118,6 @@ def main():
sys.exit(1)
with controller:
- autocompleter = stem.interpreter.autocomplete.Autocompleter(controller)
- readline.parse_and_bind('tab: complete')
- readline.set_completer(autocompleter.complete)
- readline.set_completer_delims('\n')
-
interpreter = stem.interpreter.commands.ControlInterpreter(controller)
showed_close_confirmation = False
@@ -158,6 +153,11 @@ def main():
sys.exit(1)
else:
+ autocompleter = stem.interpreter.autocomplete.Autocompleter(controller)
+ readline.parse_and_bind('tab: complete')
+ readline.set_completer(autocompleter.complete)
+ readline.set_completer_delims('\n')
+
for line in msg('msg.startup_banner').splitlines():
line_format = HEADER_BOLD_OUTPUT if line.startswith(' ') else HEADER_OUTPUT
print(format(line, *line_format))