I am slowly working on a gdal app that calculates viewshed with an eye on performance. It is still in development, and no where near done, but it may be useful. It'd actually be nice to have some input, as I just did it for fun. You can find it on my github account(see below).
The nearest neighbor sampling is pretty much a joke, but it's fast. Linear is better (one mean cell size towards the pixel of interest) but takes longer. DEMs I work with are typically about 1000 x 1000 cells, but I've tested various sizes:
kyle@kyle-workstation:~/src/gdal/git/gdal$ time gdalviewshed -alg linear smaller.tif a.tif 500 250
Processing input file.
Size is: 3171, 1080
0...10...20...30...40...50...60...70...80...90...100 - done.
real 0m0.766s
user 0m0.708s
sys 0m0.056s
kyle@kyle-workstation:~/src/gdal/git/gdal$ time gdalviewshed -alg nearest smaller.tif a.tif 500 250
Processing input file.
Size is: 3171, 1080
0...10...20...30...40...50...60...70...80...90...100 - done.
real 0m0.338s
user 0m0.256s
sys 0m0.080s
a really big one (US at 270 m):
kyle@kyle-workstation:~/src/gdal/git/gdal$ time gdalviewshed elevation.tif a.tif 1500 2500
Processing input file.
Size is: 31718, 10803
0...10...20...30...40...50...60...70...80...90...100 - done.
real 0m44.694s
user 0m39.536s
sys 0m1.492s
Next is inverse distance weighting of 3 points at one mean cell size towards the pixel of interest.
Default output is 'view height', or how high above the elevation point the viewer is seeing, masks can also be output. Any feedback is appreciated, if anyone actually uses it.
PS, I know my terminology for sampling is wacko, and it's subject to change. I don't spend a lot of time naming things.
https://github.com/ksshannon/gdal/tree/viewshed