kaleb@THYME.JPL.NASA.GOV (Kaleb Keithley) (08/31/90)
Well, as Chris Peterson pointed out, there were some major discrepancies in the timings I made using different versions of malloc; so I re-ran my tests, and GNU is indeed faster. I built three servers: Server 1 using SunOS 4.1 malloc, Server 2 using GNU emacs malloc, and Server 3 using GNUs' alpha release malloc. All servers and mallocs were built using -O3 -pg, with the exception of Suns' malloc which I don't have control over. After building the servers, I started the server from the command line, ran the x11perf benchmark, and gprof'd the gmon.out file. x11perf took about one hour, 45 minutes to run to completion (-all option.) Attached are the relevant sections from the gprof and the x11perfcomp output. BTW, the test was run on a Sun SS1 with CG3, and 8MB RAM. In summary, use of GNUs' emacs malloc() and free() saved 65 seconds and 150 seconds respectively, or just under three minutes out of the test run; Around 3.5% if my math is correct. So, is it worth it? I'd say on a slower machine, it probably is, it almost isn't worth it on the SPARC. On a faster machine, I'd guess it definitely isn't worth it unless you have an exceptionally poor implementation of malloc. malloc gprofs: SunOS malloc: 0.00 0.00 1/6649310 _dbm_open [550] 0.00 0.00 1/6649310 __default_domain [767] 0.00 0.00 1/6649310 _load_dom_binding [591] 0.00 0.00 2/6649310 __findbuf [628] 0.00 0.00 2/6649310 _on_exit [757] 0.00 0.00 2/6649310 _clntudp_bufcreate [621] 0.00 0.00 3/6649310 _calloc [737] 0.00 0.00 28/6649310 _v2domatch [475] 0.00 0.00 28/6649310 _xdr_bytes [607] 0.00 0.00 140/6649310 _makenode [626] 0.17 0.10 13889/6649310 _Xrealloc [162] 0.22 0.13 17715/6649310 _realloc [171] 80.61 49.79 6617498/6649310 _Xalloc [57] [63] 2.4 81.00 50.03 6649310 _malloc [63] 43.41 0.00 5745550/5745550 _demote [118] 3.28 2.94 903760/6954542 _delete [111] 0.36 0.03 81/81 _morecore [338] ------------------------------------------------------------------------ GNU alpha malloc: 224678 _malloc [75] 0.00 0.00 1/7779831 _dbm_open [567] 0.00 0.00 1/7779831 __default_domain [749] 0.00 0.00 1/7779831 _load_dom_binding [591] 0.00 0.00 2/7779831 __findbuf [479] 0.00 0.00 2/7779831 _on_exit [743] 0.00 0.00 2/7779831 _clntudp_bufcreate [604] 0.00 0.00 3/7779831 _calloc [721] 0.00 0.00 28/7779831 _v2domatch [510] 0.00 0.00 28/7779831 _xdr_bytes [627] 0.00 0.00 140/7779831 _makenode [608] 0.17 0.01 13893/7779831 _Xrealloc [175] 4.22 0.28 348143/7779831 _realloc [187] 90.00 5.95 7417587/7779831 _Xalloc [67] [75] 1.8 94.40 6.24 7779831+224678 _malloc [75] 0.30 5.44 8937/8937 _morecore [223] 0.01 0.49 849/10780 ___default_morecore [219] 0.00 0.00 1/1 _initialize [638] 224678 _malloc [75] ------------------------------------------------------------------------ GNU emacs malloc: 0.00 0.00 1/8155300 _dbm_open [577] 0.00 0.00 1/8155300 __default_domain [762] 0.00 0.00 1/8155300 _load_dom_binding [631] 0.00 0.00 2/8155300 __findbuf [622] 0.00 0.00 2/8155300 _on_exit [757] 0.00 0.00 2/8155300 _clntudp_bufcreate [632] 0.00 0.00 3/8155300 _calloc [737] 0.00 0.00 28/8155300 _v2domatch [462] 0.00 0.00 28/8155300 _xdr_bytes [652] 0.00 0.00 140/8155300 _makenode [627] 0.11 0.00 13893/8155300 _Xrealloc [204] 2.22 0.02 271829/8155300 _realloc [221] 64.22 0.48 7869370/8155300 _Xalloc [85] [96] 1.3 66.56 0.49 8155300 _malloc [96] 0.03 0.46 727/727 _morecore [323] ------------------------------------------------------------------------ free gprofs: SunOS free: 0.00 0.00 2/6954557 _fclose [548] 0.00 0.00 28/6954557 _gethostbyname [404] 0.00 0.00 28/6954557 _xdr_bytes [607] 0.00 0.00 70/6954557 _freenode [637] 0.00 0.00 81/6954557 _morecore [338] 0.16 0.29 17715/6954557 _realloc [171] 2.74 5.06 306612/6954557 _shrink [205] 59.15 109.34 6630021/6954557 _Xfree [47] [46] 3.2 62.05 114.69 6954557 _free [46] 54.47 19.51 6954557/6954557 _insert [95] 21.47 19.24 5907584/6954542 _delete [111] ------------------------------------------------------------------------ GNU alpha free: 0.00 0.00 2/7786430 _fclose [748] 0.00 0.00 28/7786430 _gethostbyname [427] 0.00 0.00 28/7786430 _xdr_bytes [627] 0.00 0.00 70/7786430 _freenode [631] 3.48 0.46 356188/7786430 _realloc [187] 72.57 9.54 7430114/7786430 _Xfree [80] [82] 1.6 76.05 10.00 7786430 _free [82] 9.41 0.00 8011082/13984534 .div [158] 0.01 0.58 992/10780 ___default_morecore [219] ------------------------------------------------------------------------ GNU emacs free: 0.00 0.00 2/8153854 _fclose [494] 0.00 0.00 28/8153854 _gethostbyname [421] 0.00 0.00 28/8153854 _xdr_bytes [652] 0.00 0.00 70/8153854 _freenode [682] 0.94 0.00 271829/8153854 _realloc [221] 27.19 0.00 7881897/8153854 _Xfree [131] [135] 0.5 28.13 0.00 8153854 _free [135] ------------------------------------------------------------------------ and lastly x11perfcomp report: 1: Xsun.test 2: alpha.test 3: emacs.test 1 2 3 Operation -------- -------- -------- --------- 102000.0 105000.0 106000.0 Dot 36800.0 37500.0 37400.0 1x1 rectangle 17200.0 17700.0 17700.0 10x10 rectangle 675.0 676.0 677.0 100x100 rectangle 30.0 30.0 30.1 500x500 rectangle 15400.0 16100.0 16100.0 1x1 stippled rectangle 3160.0 3180.0 3180.0 10x10 stippled rectangle 220.0 220.0 220.0 100x100 stippled rectangle 16.2 16.3 16.2 500x500 stippled rectangle 18500.0 19000.0 19500.0 1x1 opaque stippled rectangle 4800.0 4830.0 4820.0 10x10 opaque stippled rectangle 340.0 337.0 340.0 100x100 opaque stippled rectangle 24.5 24.6 24.6 500x500 opaque stippled rectangle 26000.0 28700.0 28400.0 1x1 4x4 tiled rectangle 14300.0 14700.0 14700.0 10x10 4x4 tiled rectangle 654.0 654.0 656.0 100x100 4x4 tiled rectangle 29.8 29.8 29.8 500x500 4x4 tiled rectangle 16800.0 17400.0 17500.0 1x1 161x145 tiled rectangle 6470.0 6550.0 6550.0 10x10 161x145 tiled rectangle 243.0 243.0 242.0 100x100 161x145 tiled rectangle 11.3 11.3 11.3 500x500 161x145 tiled rectangle 33200.0 36700.0 35400.0 1-pixel line segment 26500.0 28700.0 28300.0 10-pixel line segment 12000.0 12500.0 12400.0 100-pixel line segment 3530.0 3570.0 3560.0 500-pixel line segment 8110.0 8550.0 8540.0 100-pixel line segment (1 kid) 6080.0 6640.0 6630.0 100-pixel line segment (2 kids) 5230.0 5550.0 5540.0 100-pixel line segment (3 kids) 17000.0 18200.0 18100.0 10-pixel dashed segment 5140.0 5240.0 5240.0 100-pixel dashed segment 4670.0 4750.0 4750.0 100-pixel double-dashed segment 39900.0 40900.0 39400.0 1-pixel line 31400.0 31500.0 31000.0 10-pixel line 12900.0 12900.0 12800.0 100-pixel line 3610.0 3610.0 3610.0 500-pixel line 18500.0 19600.0 19500.0 10-pixel dashed line 5260.0 5350.0 5350.0 100-pixel dashed line 4770.0 4840.0 4840.0 100-pixel double-dashed line 1950.0 1860.0 1930.0 10x1 wide line 551.0 485.0 548.0 100x10 wide line 95.4 85.5 94.9 500x50 wide line 242.0 224.0 240.0 100x10 wide dashed line 212.0 202.0 211.0 100x10 wide double-dashed line 14400.0 14500.0 12600.0 1-pixel circle 10500.0 10500.0 9130.0 10-pixel circle 4090.0 4090.0 3860.0 100-pixel circle 1150.0 1150.0 1130.0 500-pixel circle 309.0 273.0 310.0 100-pixel dashed circle 219.0 189.0 219.0 100-pixel double-dashed circle 223.0 225.0 236.0 10-pixel wide circle 51.0 54.2 55.8 100-pixel wide circle 10.8 11.2 11.5 500-pixel wide circle 14.4 15.2 15.3 100-pixel wide dashed circle 11.9 11.3 12.3 100-pixel wide double-dashed circle 5750.0 5850.0 5610.0 10-pixel partial circle 2180.0 2170.0 2150.0 100-pixel partial circle 92400.0 94100.0 93800.0 1-pixel solid circle 7360.0 7660.0 7450.0 10-pixel solid circle 597.0 599.0 599.0 100-pixel solid circle 35.3 35.3 35.4 500-pixel solid circle 2810.0 2880.0 2900.0 10-pixel fill chord partial circle 597.0 605.0 603.0 100-pixel fill chord partial circle 2920.0 3020.0 2960.0 10-pixel fill slice partial circle 590.0 607.0 602.0 100-pixel fill slice partial circle 9380.0 9480.0 8810.0 10-pixel ellipse 3560.0 3560.0 3480.0 100-pixel ellipse 953.0 952.0 946.0 500-pixel ellipse 373.0 330.0 374.0 100-pixel dashed ellipse 265.0 229.0 264.0 100-pixel double-dashed ellipse 102.0 106.0 108.0 10-pixel wide ellipse 17.2 17.3 17.6 100-pixel wide ellipse 3.8 3.8 3.8 500-pixel wide ellipse 6.3 6.4 6.4 100-pixel wide dashed ellipse 3.9 3.9 3.9 100-pixel wide double-dashed ellipse 5170.0 5240.0 5040.0 10-pixel partial ellipse 2370.0 2380.0 2340.0 100-pixel partial ellipse 7880.0 8200.0 7870.0 10-pixel filled ellipse 977.0 983.0 980.0 100-pixel filled ellipse 67.4 67.5 67.5 500-pixel filled ellipse 2920.0 2990.0 3010.0 10-pixel fill chord partial ellipse 1000.0 1020.0 1020.0 100-pixel fill chord ellipse 3050.0 3150.0 3080.0 10-pixel fill slice partial ellipse 1000.0 1020.0 990.0 100-pixel fill slice ellipse 3930.0 3780.0 3860.0 Fill 1-pixel/side triangle 2340.0 2130.0 2320.0 Fill 10-pixel/side triangle 292.0 263.0 293.0 Fill 100-pixel/side triangle 2780.0 2550.0 2770.0 Fill 10x10 trapezoid 348.0 321.0 350.0 Fill 100x100 trapezoid 940.0 968.0 966.0 Fill 10x10 stippled trapezoid 20.7 20.0 20.3 Fill 100x100 stippled trapezoid 965.0 1010.0 996.0 Fill 10x10 opaque stippled trapezoid 21.7 22.1 22.1 Fill 100x100 opaque stippled trapezoid 855.0 946.0 888.0 Fill 10x10 tiled trapezoid 17.3 18.5 17.8 Fill 100x100 tiled trapezoid 1410.0 1330.0 1450.0 Fill 10-pixel/side complex polygon 213.0 189.0 214.0 Fill 100-pixel/side complex polygons 24200.0 24200.0 24000.0 Char in 80-char line (6x13) 33200.0 33300.0 33400.0 Char in 80-char line (TR 10) 11600.0 11700.0 11700.0 Char in 30-char line (TR 24) 23700.0 23900.0 23800.0 Char in 20/40/20 line (6x13, TR 10) 43900.0 47700.0 47800.0 Char in 80-char image line (6x13) 22000.0 22000.0 22000.0 Char in 80-char image line (TR 10) 6990.0 7020.0 7040.0 Char in 30-char image line (TR 24) 3900.0 3840.0 4020.0 Scroll 10x10 pixels 394.0 393.0 394.0 Scroll 100x100 pixels 19.0 19.0 19.0 Scroll 500x500 pixels 3700.0 3600.0 3800.0 Copy 10x10 from window to window 347.0 346.0 348.0 Copy 100x100 from window to window 16.7 16.8 16.9 Copy 500x500 from window to window 3980.0 3800.0 4010.0 Copy 10x10 from pixmap to window 423.0 420.0 423.0 Copy 100x100 from pixmap to window 20.0 20.0 20.0 Copy 500x500 from pixmap to window 3850.0 3830.0 3990.0 Copy 10x10 from window to pixmap 345.0 345.0 346.0 Copy 100x100 from window to pixmap 16.6 16.6 16.6 Copy 500x500 from window to pixmap 4450.0 4440.0 4700.0 Copy 10x10 from pixmap to pixmap 468.0 467.0 469.0 Copy 100x100 from pixmap to pixmap 22.0 22.0 22.0 Copy 500x500 from pixmap to pixmap 3490.0 3340.0 3560.0 Copy 10x10 1-bit deep plane 417.0 416.0 419.0 Copy 100x100 1-bit deep plane 22.9 22.9 22.9 Copy 500x500 1-bit deep plane 2210.0 2200.0 2300.0 PutImage 10x10 square 79.8 80.2 79.0 PutImage 100x100 square 3.5 3.6 3.6 PutImage 500x500 square 354.0 364.0 367.0 GetImage 10x10 square 97.3 94.5 96.5 GetImage 100x100 square 5.1 5.2 5.1 GetImage 500x500 square 29900.0 41000.0 37100.0 X protocol NoOperation 439.0 454.0 452.0 GetAtomName 434.0 448.0 441.0 GetProperty 4540.0 4900.0 4680.0 Change graphics context 1160.0 3060.0 3540.0 Create and map subwindows (4 kids) 1010.0 1080.0 1220.0 Create and map subwindows (16 kids) 1030.0 1090.0 1230.0 Create and map subwindows (25 kids) 1020.0 1090.0 1210.0 Create and map subwindows (50 kids) 1010.0 1080.0 1200.0 Create and map subwindows (75 kids) 1000.0 1070.0 1180.0 Create and map subwindows (100 kids) 960.0 1030.0 1120.0 Create and map subwindows (200 kids) 2250.0 2230.0 2520.0 Create unmapped window (4 kids) 2240.0 2430.0 2550.0 Create unmapped window (16 kids) 2260.0 2430.0 2540.0 Create unmapped window (25 kids) 2260.0 2450.0 2520.0 Create unmapped window (50 kids) 2240.0 2490.0 2560.0 Create unmapped window (75 kids) 2260.0 2500.0 2540.0 Create unmapped window (100 kids) 2260.0 2510.0 2530.0 Create unmapped window (200 kids) 1170.0 1290.0 1560.0 Map window via parent (4 kids) 1700.0 1820.0 2170.0 Map window via parent (16 kids) 1800.0 1940.0 2310.0 Map window via parent (25 kids) 1850.0 1960.0 2320.0 Map window via parent (50 kids) 1870.0 1970.0 2320.0 Map window via parent (75 kids) 1890.0 1980.0 2360.0 Map window via parent (100 kids) 1910.0 2000.0 2370.0 Map window via parent (200 kids) 5310.0 5840.0 6120.0 Unmap window via parent (4 kids) 12400.0 12800.0 13300.0 Unmap window via parent (16 kids) 14200.0 15200.0 15500.0 Unmap window via parent (25 kids) 17400.0 17800.0 17900.0 Unmap window via parent (50 kids) 18500.0 18300.0 19000.0 Unmap window via parent (75 kids) 19200.0 19000.0 19600.0 Unmap window via parent (100 kids) 20300.0 19900.0 20500.0 Unmap window via parent (200 kids) 1310.0 2580.0 3020.0 Destroy window via parent (4 kids) 3310.0 4140.0 4890.0 Destroy window via parent (16 kids) 3780.0 4450.0 5270.0 Destroy window via parent (25 kids) 4200.0 4770.0 5620.0 Destroy window via parent (50 kids) 4320.0 4890.0 5770.0 Destroy window via parent (75 kids) 4430.0 4970.0 5840.0 Destroy window via parent (100 kids) 4490.0 5070.0 5940.0 Destroy window via parent (200 kids) 487.0 588.0 709.0 Hide/expose window via popup (4 kids) 864.0 1000.0 1190.0 Hide/expose window via popup (16 kids) 953.0 1090.0 1300.0 Hide/expose window via popup (25 kids) 978.0 1120.0 1330.0 Hide/expose window via popup (50 kids) 1020.0 1150.0 1360.0 Hide/expose window via popup (75 kids) 1050.0 1160.0 1380.0 Hide/expose window via popup (100 kids) 1080.0 1190.0 1400.0 Hide/expose window via popup (200 kids) 460.0 546.0 611.0 Move window (4 kids) 355.0 398.0 456.0 Move window (16 kids) 321.0 348.0 391.0 Move window (25 kids) 244.0 253.0 292.0 Move window (50 kids) 203.0 213.0 230.0 Move window (75 kids) 178.0 180.0 190.0 Move window (100 kids) 110.0 115.0 111.0 Move window (200 kids) 4720.0 5230.0 5010.0 Moved unmapped window (4 kids) 4780.0 5220.0 4980.0 Moved unmapped window (16 kids) 4730.0 5200.0 4960.0 Moved unmapped window (25 kids) 4750.0 5160.0 4910.0 Moved unmapped window (50 kids) 4740.0 5160.0 4910.0 Moved unmapped window (75 kids) 4720.0 5120.0 4890.0 Moved unmapped window (100 kids) 4660.0 5080.0 4830.0 Moved unmapped window (200 kids) 1340.0 1620.0 1840.0 Move window via parent (4 kids) 2780.0 3280.0 3660.0 Move window via parent (16 kids) 3220.0 3750.0 4160.0 Move window via parent (25 kids) 3700.0 4290.0 4730.0 Move window via parent (50 kids) 3850.0 4510.0 4930.0 Move window via parent (75 kids) 3970.0 4520.0 5020.0 Move window via parent (100 kids) 4160.0 4710.0 5180.0 Move window via parent (200 kids) 423.0 512.0 572.0 Resize window (4 kids) 359.0 413.0 453.0 Resize window (16 kids) 329.0 361.0 410.0 Resize window (25 kids) 263.0 275.0 320.0 Resize window (50 kids) 227.0 239.0 261.0 Resize window (75 kids) 202.0 205.0 221.0 Resize window (100 kids) 132.0 137.0 136.0 Resize window (200 kids) 4770.0 5390.0 5050.0 Resize unmapped window (4 kids) 4870.0 5370.0 5000.0 Resize unmapped window (16 kids) 4810.0 5300.0 5030.0 Resize unmapped window (25 kids) 4840.0 5290.0 5010.0 Resize unmapped window (50 kids) 4810.0 5290.0 4980.0 Resize unmapped window (75 kids) 4800.0 5270.0 4980.0 Resize unmapped window (100 kids) 4770.0 5210.0 4930.0 Resize unmapped window (200 kids) 184.0 223.0 264.0 Circulate window (4 kids) 128.0 155.0 181.0 Circulate window (16 kids) 125.0 145.0 171.0 Circulate window (25 kids) 115.0 136.0 159.0 Circulate window (50 kids) 109.0 133.0 150.0 Circulate window (75 kids) 105.0 128.0 142.0 Circulate window (100 kids) 92.9 107.0 117.0 Circulate window (200 kids) 15200.0 18000.0 15200.0 Circulate Unmapped window (4 kids) 13800.0 15800.0 13900.0 Circulate Unmapped window (16 kids) 11000.0 14600.0 12700.0 Circulate Unmapped window (25 kids) 10200.0 11400.0 10500.0 Circulate Unmapped window (50 kids) 8940.0 9710.0 8060.0 Circulate Unmapped window (75 kids) 7860.0 8360.0 5970.0 Circulate Unmapped window (100 kids) 5140.0 4780.0 3130.0 Circulate Unmapped window (200 kids)