Idioms: Building High Performance Networking Servers Using Tcl (2006)
maplefish.com
maplefish.com
Tcl is slower than C, but the network is slower than Tcl.Tcl is slower than Node.JS (a broad statement, but e.g., it's not JITed), and the last time I checked Tcl's event loop was select-based and not epoll/kqueue-based. Looking at the code for 8.6.2, it appears to be like that still.
I like Tcl, but I wouldn't use it for high-concurrency tasks (I would use Go for that). It's nice when you need a DSL to extend your application, or if you want to glue C libraries together, but there are better tools for network code.
Event based IO was around by 1999 or earlier, according to the C10k page that we all avidly read backin the day http://www.kegel.com/c10k.html
Am I making myself clear?
If anyone is reading this article and thinking "Gee, I wish I could get a job writing Tcl", hit me up.
invalid command name "handle_data sock4"
while executing
"[list handle_data $chan] "
(procedure "handle_client" line 8)
invoked from within
"handle_client sock4 127.0.0.1 40642"
I replaced [list handle_data $chan] with a plain handle_data $chan, but then another bug come up: invalid command name "buf"
while executing
"buf sock4,data_ready write"
(write trace on "buf(sock4,data_ready)")
invoked from within
"set buf($chan,data_ready) 0"
(procedure "handle_data" line 4)
The fun never stops :-) In a way Tcl makes shell scripting (Bash) look wonderful because at least there you can't expect much from it, whereas Tcl presents itself more like a "real", full-blown programming language.The trace command is split in to 2 lines for readability but the web page's formatting introduced a hidden space if you try to copy/paste the example in to a tcl script.
I stopped right there. To me, high performance is for instance, handling millions of emails per minute, thousands or tenth of thousand TPS. This is high performance, real life performance, not seen only in "physic labs and university research centers".
Some comments talk about Tcl using select. If this is true, it would mean a max of 1024 connections in parallel, kind of sad...
Moreover, Linux and FreeBSD have introduced syscalls comparable to select(): epoll (in 2002) and kqueue (in 2000). Those are way faster than select() and I think there's (virtually) no limit on FDs. Tcl must be using select() for its portability I guess.
So, handling a lot of concurrent connections is an old problem. In 2006, the C10k problem was way behind. Even at that time, I would have expected a program to be able to handle thousands of TPS.
This is obnoxious, way too common and as another comment points out seemingly aloof to the fact that the article is 8 years old.
Please, just to stick to self-promotion [1][2][3][4].
1: https://news.ycombinator.com/item?id=6560909 2: https://news.ycombinator.com/item?id=6573974 3: https://news.ycombinator.com/item?id=8086250 4: https://news.ycombinator.com/item?id=8200975
;)
And as I'm saying in following comments, even in 2006, this was poor performance.