Speeding up screen output for dialog

Bernd Schmidt (crux@pool.informatik.rwth-aachen.de)
Mon, 2 Sep 1996 09:57:33 +0200 (MET DST)


I've been wondering why some dialog-based applications (e.g. menuconfig) take
so long even on a P90 to draw the screen. So I made some investigations with
strace. I found that ncurses writes to the screen in rather large blocks of
bytes, but these get broken up in write_chan() in n_tty.c into single byte
writes to the console, which is inefficient (I assume that setting the cursor
after each write is the most time-consuming part). So I came up with a hack:
Instead of calling opost() for each byte, I wrote a new function opost_block()
that examines the buffer and returns the number of bytes that can be directly
written. These are then passed to con_write() instead of put_char().

I've attached a patch. Comments are welcome. I didn't try very hard to make
opost_block() return the maximum number of characters that can be written,
there may be some room for improvement. Even so, there is a substantial speed
increase for menuconfig (I made the Makefile link lxdialog statically for good
measure). It's almost enjoyable now :)

Bernd

begin 644 fast_opost.diff
M9&EF9B`M=7)D(&QI;G5X+6]R:6<O9')I=F5R<R]C:&%R+VY?='1Y+F,@;&EN
M=7@O9')I=F5R<R]C:&%R+VY?='1Y+F,*+2TM(&QI;G5X+6]R:6<O9')I=F5R
M<R]C:&%R+VY?='1Y+F,)5V5D($IU;"`R-"`P.3HT.3HU,R`Q.3DV"BLK*R!L
M:6YU>"]D<FEV97)S+V-H87(O;E]T='DN8PE3=6X@4V5P("`Q(#$V.C0R.C$Y
M(#$Y.38*0$`@+3$U-2PV("LQ-34L,S@@0$`*(`ER971U<FX@,#L*('T*(`HK
M<W1A=&EC(&EN="!O<&]S=%]B;&]C:RAS=')U8W0@='1Y7W-T<G5C="`J('1T
M>2P**PD)("`@("`@(&-O;G-T('5N<VEG;F5D(&-H87(@*B!B=68L('5N<VEG
M;F5D(&EN="!N<BD**WL**PEI;G0@<W!A8V4["BL):6YT(&D["BL**PES<&%C
M92`]('1T>2T^9')I=F5R+G=R:71E7W)O;VTH='1Y*3L**PEI9B`H(7-P86-E
M*0HK"0ER971U<FX@+3$["BL):68@*&YR(#X@<W!A8V4I"BL)"6YR(#T@<W!A
M8V4["BL)9F]R("AI(#T@,#L@:2`\(&YR.R!I*RLI('L**PD)=6YS:6=N960@
M8VAA<B!C(#T@9V5T7W5S97(H8G5F("L@:2D["BL**PD):68@*&,@/3T@)UQN
M)RD@>PHK"0D):68@*$]?3TY,0U(H='1Y*2D**PD)"0EB<F5A:SL**PHK"0D)
M:68@*$]?3TY,4D54*'1T>2DI"BL)"0D)='1Y+3YC;VQU;6X@/2`P.PHK"0D)
M='1Y+3YC86YO;E]C;VQU;6X@/2!T='DM/F-O;'5M;CL**PD)?2!E;'-E(&EF
M("AC(#T]("=<<B<@?'P@8R`]/2`G7'0G('Q\(&,@/3T@)UQB)R!\?"!I<V-N
M=')L*&,I*2!["BL)"0EB<F5A:SL**PD)?2!E;'-E('L**PD)"6EF("A/7T],
M0U5#*'1T>2D@)B8@=&]U<'!E<BAC*2`A/2!C*0HK"0D)"6)R96%K.PHK"0D)
M='1Y+3YC;VQU;6XK*SL**PD)?0HK"7T**PER971U<FX@:3L**WT**PH@<W1A
M=&EC(&EN;&EN92!V;VED('!U=%]C:&%R*'5N<VEG;F5D(&-H87(@8RP@<W1R
M=6-T('1T>5]S=')U8W0@*G1T>2D*('L*(`ET='DM/F1R:79E<BYP=71?8VAA
M<BAT='DL(&,I.PI`0"`M.34P+#8@*SDX,BPQ-2!`0`H@"0E]"B`)"6EF("A/
M7T]03U-4*'1T>2DI('L*(`D)"7=H:6QE("AN<B`^(#`I('L**PD)"0EI;G0@
M;G)?;F]R;6%L(#T@;W!O<W1?8FQO8VLH='1Y+"!B+"!N<BD["BL)"0D):68@
M*&YR7VYO<FUA;"`^(#`I('L**PD)"0D):68@*'1T>2T^9')I=F5R+F9L=7-H
M7V-H87)S*0HK"0D)"0D)='1Y+3YD<FEV97(N9FQU<VA?8VAA<G,H='1Y*3L*
M*PD)"0D);G)?;F]R;6%L(#T@='1Y+3YD<FEV97(N=W)I=&4H='1Y+"`Q+"!B
M+"!N<E]N;W)M86PI.PHK"0D)"0EB("L](&YR7VYO<FUA;#L@;G(@+3T@;G)?
M;F]R;6%L.PHK"0D)"7T**PD)"0EI9B`H;G(@/3T@,"D**PD)"0D)8G)E86L[
M"B`)"0D)8R`](&=E=%]U<V5R*&(I.PH@"0D)"6EF("AO<&]S="AC+"!T='DI
M(#P@,"D*(`D)"0D)8G)E86L["D!`("TY-C(L-R`K,3`P,RPW($!`"B`)"0EB
M("L](&,["B`)"0EN<B`M/2!C.PH@"0E]"BT)"6EF("@A;G(I"BL)"6EF("AN
M<B`]/2`P*0H@"0D)8G)E86L["B`)"6EF("AF:6QE+3YF7V9L86=S("8@3U].
M3TY"3$]#2RD@>PH@"0D)<F5T=F%L(#T@+45!1T%)3CL*9&EF9B`M=7)D(&QI
M;G5X+6]R:6<O<V-R:7!T<R]L>&1I86QO9R]-86ME9FEL92!L:6YU>"]S8W)I
M<'1S+VQX9&EA;&]G+TUA:V5F:6QE"BTM+2!L:6YU>"UO<FEG+W-C<FEP=',O
M;'AD:6%L;V<O36%K969I;&4)4V%T($%P<B`R,"`Q,#HQ.#HQ-"`Q.3DV"BLK
M*R!L:6YU>"]S8W)I<'1S+VQX9&EA;&]G+TUA:V5F:6QE"5-U;B!397`@(#$@
M,3<Z,3DZ,S0@,3DY-@I`0"`M,RPW("LS+#<@0$`*($]05$E-(#T@+4\R("U7
M86QL("UF;VUI="UF<F%M92UP;VEN=&5R"B`*($-&3$%'4R`]("0H3U!424TI
M("U$3$]#04Q%(`HM3$1&3$%'4R`]("US("U,("X**TQ$1DQ!1U,@/2`M<R`M
M<W1A=&EC("U,("X*($Q$3$E"4R`]("UL;F-U<G-E<PH@"B!I9F5Q("@O=7-R
M+VEN8VQU9&4O;F-U<G-E<R]N8W5R<V5S+F@L("0H=VEL9&-A<F0@+W5S<B]I
;;F-L=61E+VYC=7)S97,O;F-U<G-E<RYH*2D*
`
end