Because curious cats ask clever code monkeys.

Frequently Asked Questions

Here I’ll try to list some common questions that get asked for.

Why...

...write in Python? It’s slow/bloated/bad?

Performance

Profiles were configured with command bash -c exit, and the
commands run a couple of times to get the caches loaded up.

GNOME-Terminal:

time for i in {1..30} ; do gnome-terminal --profile=Quickexit; done

real    0m10.606s

Terminator:

time for i in {1..30} ; do terminator -g deletemeconfig -p Quickexit; done

GTK2: real    0m11.928s A smidgen slower.
GTK3: real    0m10.885s Yeah, basically identical!

Cold start, using sync && echo 3 > /proc/sys/vm/drop_caches before each run, then launching a single timed instance.

Gnome-Terminal:

time gnome-terminal --profile=Quickexit

real    0m7.628s (approx median, there was a strange variance for GT, between 5 and 9 secs)

Terminator:

time terminator -g deletemeconfig -p Quickexit

GTK2: real    0m11.390s (median of 3x)
GTK3: real    0m11.264s (median of 3x)

OK, so this is the once place you would notice an appreciable difference. How often do you start these things with completely empty caches/buffers?

In GTK2 there is a known issue which slows the cat’ing of large files quite a bit. The VTE in GTK3 Terminator is the exact same widget GNOME-Terminal uses, so this will get better, as and when we move fully to the in-progress GTK3 port. I should point out that this performance deficit is not due to the Python interpreter, or the Terminator Python code, but is solely down to the compiled C code VTE widget.

Memory use - The dumb way

GNOME-Terminal:

 for i in {1..100} ; do gnome-terminal --disable-factory & done

root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free           # Before startup
              total       used       free     shared    buffers     cached
 Mem:       3102404    1388776    1713628       4052        164      45340
 -/+ buffers/cache:    1343272    1759132
 Swap:      3121996     788704    2333292
 root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free          # After startup
              total       used       free     shared    buffers     cached
 Mem:       3102404    2439524     662880      57196       1240      99212
 -/+ buffers/cache:    2339072     763332
 Swap:      3121996     751440    2370556
 root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free          # After kill
              total       used       free     shared    buffers     cached
 Mem:       3102404    1466536    1635868       4796        160      45912
 -/+ buffers/cache:    1420464    1681940
 Swap:      3121996     751020    2370976

 Used (used mem -buffers/cache + swap)
     Before start: 2131976
     After start : 3090512 = 958536 kbytes, 936 Mbytes / 9.36 MBytes/instance
     After kill  : 2171484 =  39508 kbytes,  38 Mbytes not recovered

Terminator GTK2:

for i in {1..100} ; do terminator -g deletemeconfig -u & done

root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       3102404    1313456    1788948       4284        152      43844
-/+ buffers/cache:    1269460    1832944
Swap:      3121996     736844    2385152
root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       3102404    2866552     235852      19484       1084      65408
-/+ buffers/cache:    2800060     302344
Swap:      3121996     736340    2385656
root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       3102404    1317724    1784680       4284        152      43464
-/+ buffers/cache:    1274108    1828296
Swap:      3121996     736304    2385692

Used (used mem -buffers/cache + swap)
    before start: 2006304
    after start : 3536400 = 1530096 kbytes, 1494 Mbytes / 14.94 MBytes/instance
    after kill  : 2010412 =    4108 kbytes,    4 Mbytes not recovered

Terminator GTK3:

for i in {1..100} ; do terminator -g deletemeconfig -u & done

root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
         total       used       free     shared    buffers     cached
Mem:       3102404    1467204    1635200       4816        120      46132
-/+ buffers/cache:    1420952    1681452
Swap:      3121996     751000    2370996
root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       3102404    2848372     254032       7216        960      52652
-/+ buffers/cache:    2794760     307644
Swap:      3121996     750016    2371980
root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       3102404    1483388    1619016       4820        148      46084
-/+ buffers/cache:    1437156    1665248
Swap:      3121996     749828    2372168

Used (used mem -buffers/cache + swap)
    before start: 2171952
    after start : 3544776 = 1372824 kbytes, 1340 Mbytes / 13.41 MBytes/instance
    after kill  : 2186984 =   15032 kbytes,   15 Mbytes not recovered

OK, so yes, there is more overhead. We did just start 100 Python interpreters! As titled, this is dumb, and even if you use this dumb method, are you really going to have a hundred of them?...

Memory use - The sensible way

GNOME-Terminal:

gnome-terminal &
for i in {1..100} ; do gnome-terminal & done

root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free          # Before 100
             total       used       free     shared    buffers     cached
Mem:       3102404    1490996    1611408       5344        172      47580
-/+ buffers/cache:    1443244    1659160
Swap:      3121996     749776    2372220
root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free          # After 100
             total       used       free     shared    buffers     cached
Mem:       3102404    1878228    1224176       5344        172      47388
-/+ buffers/cache:    1830668    1271736
Swap:      3121996     733396    2388600
root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free          # After kill
             total       used       free     shared    buffers     cached
Mem:       3102404    1491888    1610516       4840        272      46088
-/+ buffers/cache:    1445528    1656876
Swap:      3121996     733240    2388756

Used (used mem -buffers/cache + swap)
    Before start: 2193020
    After start : 2564064 = 371044 kbytes, 362 Mbytes / 3.59 MBytes/instance
    After kill  : 2178768 = −14252 kbytes, -13.92 Mbytes recovered (first process)

Terminator GTK2:

terminator -g deletemeconfig &
for i in {1..100} ; do terminator -g deletemeconfig -u & done

root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       3102404    1324492    1777912       4388        152      49688
-/+ buffers/cache:    1274652    1827752
Swap:      3121996     744528    2377468
root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       3102404    1652112    1450292       4756        860      49968
-/+ buffers/cache:    1601284    1501120
Swap:      3121996     744224    2377772
root@pinpoint:~# sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       3102404    1305376    1797028       4236        124      42836
-/+ buffers/cache:    1262416    1839988
Swap:      3121996     744116    2377880

Used (used mem -buffers/cache + swap)
    before start: 2019180
    after start : 2345508 = 326328 kbytes, 319 Mbytes / 3.16 MBytes/instance
    after kill  : 2006532 = −12648 kbytes,  -12.35 Mbytes recovered (first process)

Terminator GTK3:

Not possible at the moment because the DBus interface still needs fixing.

So that one surprised me a bit. The fact that when using the single process we are more memory efficient. Python + 100 terminals is using <90% of the GNOME-Terminal + 100 terminals.

Some may think that this is something to do with the different version of the VTE widget, but hang on a second. In the dumb method GTK2 Terminator used more memory than GTK3. Once the DBus is fixed for GTK3 there could potentially be more savings.

“Python sucks!”

Yeah, whatever. The fact is that I’m a helluva lot more productive in Python than I ever was, am, or will be, in C. In my totally biased and uninformed opinion, I also think certain things are much easier to get working in Python because you can iterate faster. With the Debugging option to run an interactive terminal you even have the ability to try out ideas and explore the running instance directly. Results don’t get more immediate than that!

In summary

It’s a bit slower on startup, it takes a bit more memory, but that’s when you use the dumb method. In normal use, where you’re likely to be using the existing process to open a new window, it is for all practical purposes as fast as the compiled GNOME-Terminal. It may even (according to the last memory section) be a little lighter memory wise, and more obliging about giving it back!

I didn’t compare to things like xterm, because frankly we’re not aimed at the same people. Personally I’d rather have the more extensive features saving me lots of time over the course of the day when using it, than save a handful of seconds every few days when I restart it, or worrying about an extra 5 or 10 MBytes.

How do I...

...make Terminator work like Quake style terminals?

You can get close, but it isn’t a perfect recreation, as Terminator was not designed with this in mind, but improvements are always welcome!

  • Window state: Hidden
  • Always on top: On
  • Show on all workspaces: On
  • Hide on lose focus: On
  • Hide from taskbar
  • Window borders: Off (use Alt+click-drag and Alt+middle-click-drag to position and size window.)
  • Set the Toggle window visibility shortcut to your preference

Note

It must be the first Terminator instance started, because at present only the first instance can bind to the Window toggle.

This will give you a terminal hidden at startup that appears with a keypress and disappears, either with another keypress, or losing focus. It will stay on top, and appear on whichever workspace you are on.

Something that we don’t have is the slide in action of a true Quake style terminal. The terminal will simply flick into view, and flick out of view.

Warning

The Hide on lose focus option is problematic at this time. You will probably find it very frustrating.