Why is VNC so slow?
Ok, this is just a rant more than anything. I've been using VNC for years, and I just don't understand why over anything less than a 100baseT link it's so unusable. And even over 100baseT it's marginal. I connect via any client to a remote X11 VNC server, and bring up a terminal and start typing, and it LAGS by minutes! Why is it so hard to send the 10x10 pixel block of the last character I typed? What the heck is it sending back and forth during that entire time before it does send that little pixel block? Yes, it's great that VNC is free, which is why I use it. And it's great that it lets me telecommute. But it's frustrating because something that would take me a couple minutes at the office now takes me HOURS to do from home.
Update: I needed to see some error messages on a computer to diagnose it. Over the phone I told the person on the other end to log in and out and type stuff and it performed quite well! But as soon as I start typing or clicking everything went dirt slow for me. Why does sending events make VNC lag and refuse to send the screen updates, but yet local events don't do that and VNC sends the screen updates quite quickly?
Update Jun 7, 2012: I've noticed this article has become one of the more popular ones on my blog. Since I wrote my rant, I've done some more research into why VNC is so slow. It turns out it was designed that way.
VNC started off as a research project at the Olivetti & Oracle Research Lab. It seems like for the most part it was designed as a quick and dirty hack to do some screen sharing and remote control. The protocol was badly designed from the start: the way it is intended to work is for the client to keep polling the server and receiving the entire screen. It wasn't designed for the server to send updates, small regions or anything.
The design of polling of the entire screen has pretty much stuck with VNC and while there have been hacks to try to send smaller regions or poll for updates more often, the entire design is flawed. The server side should be controlling the screen updating, not the client side. It's the server that knows when the screen changed and what areas. Why VNC was designed this way when other screen sending methodology of the time was server driven is still unclear.
The only real way to make VNC go faster is to simply not use it and use a better designed protocol such as Microsoft's Remote Desktop Protocol. If you're stuck with VNC you're pretty much stuck with slow.