[comp.windows.x] yup, X is RasterOp on Wheels ...

rws@EXPO.LCS.MIT.EDU (Bob Scheifler) (09/07/89)

 ... and the spedometer will read quite a bit higher in R4.

Over the past couple of months a lot of people have expressed their concerns to
us about the performance of the MIT sample server, specifically the memory
requirements when used on low-end systems and the speed of the color frame
buffer code.  We've been working pretty hard on these issues, so to help you
plan for the not-too-distant future we'd like to give you a glimpse of what it
will be like. 

The numbers below are for a recent snapshot of our development system.  All
numbers are subject to change (for better or for worse) between now and the
actual release.  We still have some work to do. 

The server was compiled with gcc version 1.35 and run on a Sun 3/60 with 16Mb
of memory, running SunOS 4.0.3.  The screen is a direct-access 8-bit color
frame buffer, with no hardware assist, using a software cursor.  There is no
SunOS-specific graphics code in this server, it is all portable frame buffer
code which also runs on other platforms.  Many of the numbers given below are
not particularly dependent on color vs. monochrome, and apply to a monochrome
server as well.  Some of the techniques used in the color code have also been
used to speed up monochrome operations, but monochrome numbers are not given
here. 

Please do not ask questions about these numbers; we are unlikely to provide
any further information until the release is actually out.  Hopefully it will
make a nice Christmas present ...

You are encouraged to perform these science experiments at home, and compare
the numbers below with your favorite system, even if it is monochrome.  Please
remember to calculate an appropriate performance multiplier based on the
processor speed and architecture, and the frame buffer access time.


Memory usage: Run the server under xdm and log in, starting up the following
clients:  xrdb, twm, 3 xterms, xemacs, xclock, 2 xloads, xbiff, xmh, and xman.
The combined size of the server's data and stack segments (the "SIZE" field
reported by "ps avx") is 392 Kb.

Speed: Run Digital's x11perf (X11 performance program, version 1.0) on a
server started by hand, with nothing else running.  Results:

400000 reps @  0.0149 msec (67200.0/sec): Dot
 50000 reps @  0.1011 msec (9890.0/sec): 1x1 rectangle
 40000 reps @  0.1589 msec (6290.0/sec): 10x10 rectangle
  6000 reps @  1.6092 msec ( 621.0/sec): 100x100 rectangle
   200 reps @ 29.2772 msec (  34.2/sec): 500x500 rectangle
 30000 reps @  0.1932 msec (5180.0/sec): 1x1 transparent stippled rectangle
  6000 reps @  0.8726 msec (1150.0/sec): 10x10 transparent stippled rectangle
   600 reps @ 10.9257 msec (  91.5/sec): 100x100 transparent stippled rectangle
    40 reps @ 126.8860 msec (   7.9/sec): 500x500 transparent stippled rectangle
 30000 reps @  0.1805 msec (5540.0/sec): 1x1 opaque stippled rectangle
  7000 reps @  0.7536 msec (1330.0/sec): 10x10 opaque stippled rectangle
   900 reps @  8.0394 msec ( 124.0/sec): 100x100 opaque stippled rectangle
    70 reps @ 75.9349 msec (  13.2/sec): 500x500 opaque stippled rectangle
 50000 reps @  0.1103 msec (9070.0/sec): 1x1 4x4 tiled rectangle
 30000 reps @  0.1798 msec (5560.0/sec): 10x10 4x4 tiled rectangle
  2400 reps @  1.7648 msec ( 567.0/sec): 100x100 4x4 tiled rectangle
   200 reps @ 30.0772 msec (  33.2/sec): 500x500 4x4 tiled rectangle
 80000 reps @  0.0669 msec (14900.0/sec): 1-pixel line segment
 60000 reps @  0.0879 msec (11400.0/sec): 10-pixel line segment
 40000 reps @  0.1599 msec (6250.0/sec): 100-pixel line segment
 20000 reps @  0.4688 msec (2130.0/sec): 500-pixel line segment
 30000 reps @  0.2425 msec (4120.0/sec): 100-pixel line segment (1 clip rect)
 20000 reps @  0.3128 msec (3200.0/sec): 100-pixel line segment (2 clip rects)
 20000 reps @  0.3888 msec (2570.0/sec): 100-pixel line segment (3 clip rects)
 20000 reps @  0.3858 msec (2590.0/sec): 100-pixel dashed segment
 80000 reps @  0.0644 msec (15500.0/sec): 1-pixel line
 70000 reps @  0.0805 msec (12400.0/sec): 10-pixel line
 40000 reps @  0.1529 msec (6540.0/sec): 100-pixel line
 10000 reps @  0.5075 msec (1970.0/sec): 500-pixel line
 20000 reps @  0.3828 msec (2610.0/sec): 100-pixel dashed line
 40000 reps @  0.1329 msec (7530.0/sec): 1-pixel diameter circle
 30000 reps @  0.1718 msec (5820.0/sec): 10-pixel diameter circle
  9000 reps @  0.5639 msec (1770.0/sec): 100-pixel diameter circle
  2250 reps @  2.2646 msec ( 442.0/sec): 500-pixel diameter circle
  4000 reps @  1.4189 msec ( 705.0/sec): 1-pixel diameter solid circle
  1000 reps @  6.1154 msec ( 164.0/sec): 10-pixel diameter solid circle
   100 reps @ 59.9544 msec (  16.7/sec): 100-pixel diameter solid circle
    20 reps @ 484.7720 msec (   2.1/sec): 500-pixel diameter solid circle
   400 reps @ 18.5886 msec (  53.8/sec): 10-pixel diameter ellipse
    50 reps @ 117.1088 msec (   8.5/sec): 100-pixel diameter ellipse
    20 reps @ 525.7720 msec (   1.9/sec): 500-pixel diameter ellipse
  1000 reps @  5.6554 msec ( 177.0/sec): 10-pixel diameter filled ellipse
   100 reps @ 51.3544 msec (  19.5/sec): 100-pixel diameter filled ellipse
    20 reps @ 337.7720 msec (   3.0/sec): 500-pixel diameter filled ellipse
 20000 reps @  0.4788 msec (2090.0/sec): Fill 1-pixel/side triangle
  5000 reps @  1.1111 msec ( 900.0/sec): Fill 10-pixel/side triangle
   300 reps @ 17.9181 msec (  55.8/sec): Fill 100-pixel/side triangle
  6000 reps @  0.9692 msec (1030.0/sec): Fill 10x10 trapezoid
   400 reps @ 16.1886 msec (  61.8/sec): Fill 100x100 trapezoid
  4000 reps @  1.6339 msec ( 612.0/sec): Fill 10-pixel/side complex polygon
   300 reps @ 18.0515 msec (  55.4/sec): Fill 100-pixel/side complex polygons
 48000 reps @  0.1070 msec (9350.0/sec): Char in 80-char line (6x13)
 72000 reps @  0.0730 msec (13700.0/sec): Char in 80-char line (TR 10)
 22400 reps @  0.2677 msec (3740.0/sec): Char in 30-char line (TR 24)
 56000 reps @  0.1031 msec (9700.0/sec): Char in 20/40/20 line (6x13, TR 10)
 64000 reps @  0.0862 msec (11600.0/sec): Char in 80-char image line (6x13)
 56000 reps @  0.0988 msec (10100.0/sec): Char in 80-char image line (TR 10)
 19200 reps @  0.2946 msec (3390.0/sec): Char in 30-char image line (TR 24)
  9000 reps @  0.5773 msec (1730.0/sec): Scroll 10x10 pixels
  2000 reps @  3.3877 msec ( 295.0/sec): Scroll 100x100 pixels
    90 reps @ 56.1715 msec (  17.8/sec): Scroll 500x500 pixels
  8000 reps @  0.6094 msec (1640.0/sec): Copy 10x10 square
  1200 reps @  5.1962 msec ( 192.0/sec): Copy 100x100 square
    80 reps @ 99.9430 msec (  10.0/sec): Copy 500x500 square
 12000 reps @  0.5280 msec (1890.0/sec): Copy 10x10 square from pixmap
  1200 reps @  4.6962 msec ( 213.0/sec): Copy 100x100 square from pixmap
    80 reps @ 86.6930 msec (  11.5/sec): Copy 500x500 square from pixmap
  8000 reps @  0.6394 msec (1560.0/sec): Copy 10x10 1-bit deep plane
   800 reps @  7.2193 msec ( 139.0/sec): Copy 100x100 1-bit deep plane
    40 reps @ 127.3860 msec (   7.8/sec): Copy 500x500 1-bit deep plane
  8000 reps @  1.0444 msec ( 957.0/sec): PutImage 10x10 square
   200 reps @ 24.5772 msec (  40.7/sec): PutImage 100x100 square
    12 reps @ 489.6199 msec (   2.0/sec): PutImage 500x500 square
  1200 reps @  4.8462 msec ( 206.0/sec): GetImage 10x10 square
   320 reps @ 17.2983 msec (  57.8/sec): GetImage 100x100 square
    16 reps @ 337.2149 msec (   3.0/sec): GetImage 500x500 square
 90000 reps @  0.0595 msec (16800.0/sec): X protocol NoOperation
  2000 reps @  3.8277 msec ( 261.0/sec): GetAtomName
  2000 reps @  3.9177 msec ( 255.0/sec): GetProperty
 12000 reps @  0.4863 msec (2060.0/sec): Graphics context validation
  2000 reps @  2.7377 msec ( 365.0/sec): Create and map subwindows (4 kids)
  2400 reps @  3.1898 msec ( 314.0/sec): Create and map subwindows (16 kids)
  2000 reps @  3.0677 msec ( 326.0/sec): Create and map subwindows (25 kids)
  2000 reps @  3.1077 msec ( 322.0/sec): Create and map subwindows (50 kids)
  2250 reps @  3.2513 msec ( 308.0/sec): Create and map subwindows (75 kids)
  2000 reps @  3.4177 msec ( 293.0/sec): Create and map subwindows (100 kids)
  1400 reps @  4.0967 msec ( 244.0/sec): Create and map subwindows (200 kids)
  2400 reps @  0.7981 msec (1250.0/sec): Create unmapped window (4 kids)
  2400 reps @  0.7981 msec (1250.0/sec): Create unmapped window (16 kids)
  2500 reps @  0.7982 msec (1250.0/sec): Create unmapped window (25 kids)
  2500 reps @  0.7982 msec (1250.0/sec): Create unmapped window (50 kids)
  2400 reps @  0.7981 msec (1250.0/sec): Create unmapped window (75 kids)
  2400 reps @  0.7981 msec (1250.0/sec): Create unmapped window (100 kids)
  2400 reps @  0.7981 msec (1250.0/sec): Create unmapped window (200 kids)
  2400 reps @  1.8231 msec ( 549.0/sec): Map window via parent (4 kids)
  2400 reps @  1.2648 msec ( 791.0/sec): Map window via parent (16 kids)
  2500 reps @  1.2062 msec ( 829.0/sec): Map window via parent (25 kids)
  2500 reps @  1.1742 msec ( 852.0/sec): Map window via parent (50 kids)
  2400 reps @  1.1564 msec ( 865.0/sec): Map window via parent (75 kids)
  2400 reps @  1.1481 msec ( 871.0/sec): Map window via parent (100 kids)
  2400 reps @  1.1314 msec ( 884.0/sec): Map window via parent (200 kids)
  2400 reps @  0.3064 msec (3260.0/sec): Unmap window via parent (4 kids)
  2400 reps @  0.1231 msec (8120.0/sec): Unmap window via parent (16 kids)
  2500 reps @  0.1022 msec (9790.0/sec): Unmap window via parent (25 kids)
  2500 reps @  0.0782 msec (12800.0/sec): Unmap window via parent (50 kids)
  2400 reps @  0.0731 msec (13700.0/sec): Unmap window via parent (75 kids)
  2400 reps @  0.0731 msec (13700.0/sec): Unmap window via parent (100 kids)
  2400 reps @  0.0648 msec (15400.0/sec): Unmap window via parent (200 kids)
  2400 reps @  1.8481 msec ( 541.0/sec): Destroy window via parent (4 kids)
  2400 reps @  0.6064 msec (1650.0/sec): Destroy window via parent (16 kids)
  2500 reps @  0.5422 msec (1840.0/sec): Destroy window via parent (25 kids)
  2500 reps @  0.4862 msec (2060.0/sec): Destroy window via parent (50 kids)
  2400 reps @  0.4731 msec (2110.0/sec): Destroy window via parent (75 kids)
  2400 reps @  0.4731 msec (2110.0/sec): Destroy window via parent (100 kids)
  2400 reps @  0.4648 msec (2150.0/sec): Destroy window via parent (200 kids)
  1200 reps @  5.2295 msec ( 191.0/sec): Hide/expose window via popup (4 kids)
  3200 reps @  2.7361 msec ( 365.0/sec): Hide/expose window via popup (16 kids)
  2000 reps @  2.5077 msec ( 399.0/sec): Hide/expose window via popup (25 kids)
  2500 reps @  2.3422 msec ( 427.0/sec): Hide/expose window via popup (50 kids)
  3000 reps @  2.1585 msec ( 463.0/sec): Hide/expose window via popup (75 kids)
  3000 reps @  2.1518 msec ( 465.0/sec): Hide/expose window via popup (100 kids)
  4000 reps @  2.1039 msec ( 475.0/sec): Hide/expose window via popup (200 kids)
  1200 reps @  4.5129 msec ( 222.0/sec): Move window (4 kids)
   960 reps @  6.1827 msec ( 162.0/sec): Move window (16 kids)
   750 reps @  7.1406 msec ( 140.0/sec): Move window (25 kids)
  1000 reps @  9.3154 msec ( 107.0/sec): Move window (50 kids)
   450 reps @ 11.5010 msec (  86.9/sec): Move window (75 kids)
   400 reps @ 13.7386 msec (  72.8/sec): Move window (100 kids)
   400 reps @ 22.8886 msec (  43.7/sec): Move window (200 kids)
 12000 reps @  0.4213 msec (2370.0/sec): Moved unmapped window (4 kids)
 12800 reps @  0.4200 msec (2380.0/sec): Moved unmapped window (16 kids)
 12500 reps @  0.4188 msec (2390.0/sec): Moved unmapped window (25 kids)
 15000 reps @  0.4184 msec (2390.0/sec): Moved unmapped window (50 kids)
 15000 reps @  0.4184 msec (2390.0/sec): Moved unmapped window (75 kids)
 20000 reps @  0.4178 msec (2390.0/sec): Moved unmapped window (100 kids)
 12000 reps @  0.4180 msec (2390.0/sec): Moved unmapped window (200 kids)
  1200 reps @  5.1129 msec ( 196.0/sec): Resize window (4 kids)
   960 reps @  6.2036 msec ( 161.0/sec): Resize window (16 kids)
   750 reps @  6.9539 msec ( 144.0/sec): Resize window (25 kids)
  1000 reps @  8.5554 msec ( 117.0/sec): Resize window (50 kids)
   525 reps @ 10.3151 msec (  96.9/sec): Resize window (75 kids)
   400 reps @ 11.9886 msec (  83.4/sec): Resize window (100 kids)
   400 reps @ 19.0886 msec (  52.4/sec): Resize window (200 kids)
 12000 reps @  0.4413 msec (2270.0/sec): Resize unmapped window (4 kids)
 12800 reps @  0.4403 msec (2270.0/sec): Resize unmapped window (16 kids)
 12500 reps @  0.4412 msec (2270.0/sec): Resize unmapped window (25 kids)
 15000 reps @  0.4424 msec (2260.0/sec): Resize unmapped window (50 kids)
 15000 reps @  0.4410 msec (2270.0/sec): Resize unmapped window (75 kids)
 20000 reps @  0.4408 msec (2270.0/sec): Resize unmapped window (100 kids)
 12000 reps @  0.4396 msec (2270.0/sec): Resize unmapped window (200 kids)
   400 reps @ 13.5386 msec (  73.9/sec): Circulate window (4 kids)
   320 reps @ 20.2357 msec (  49.4/sec): Circulate window (16 kids)
   250 reps @ 20.8617 msec (  47.9/sec): Circulate window (25 kids)
   250 reps @ 22.0618 msec (  45.3/sec): Circulate window (50 kids)
   225 reps @ 23.1797 msec (  43.1/sec): Circulate window (75 kids)
   200 reps @ 24.8772 msec (  40.2/sec): Circulate window (100 kids)
   200 reps @ 27.1772 msec (  36.8/sec): Circulate window (200 kids)
 36000 reps @  0.1393 msec (7180.0/sec): Circulate Unmapped window (4 kids)
 32000 reps @  0.1599 msec (6260.0/sec): Circulate Unmapped window (16 kids)
 50000 reps @  0.1791 msec (5580.0/sec): Circulate Unmapped window (25 kids)
 25000 reps @  0.2174 msec (4600.0/sec): Circulate Unmapped window (50 kids)
 22500 reps @  0.2611 msec (3830.0/sec): Circulate Unmapped window (75 kids)
 20000 reps @  0.3048 msec (3280.0/sec): Circulate Unmapped window (100 kids)
 12000 reps @  0.4780 msec (2090.0/sec): Circulate Unmapped window (200 kids)