dillon@CORY.BERKELEY.EDU (Matt Dillon) (03/26/88)
Here are some timing tests on the relative speed of message passing and software interrupt overhead. The code is included. (It's too small to bother the moderators). -Matt #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # README # softint.c # softint.uue # taskswitch.c # taskswitch.uue # This archive created: Sat Mar 26 00:56:19 1988 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'README'" '(1455 characters)' if test -f 'README' then echo shar: "will not over-write existing file 'README'" else cat << \!Funky!Stuff! > 'README' This is too small to post to the moderators. It should interest those of you who are interested in practical message passing speeds between two processes and practical software interrupt handler speeds. TEST 1: Given two tasks running at priority 0 (the priority doesn't really effect the results) with no other applications running, how fast can these two tasks bandy a message back and forth? Each cycle is defined by: A-(msg)->B, B-(msg)->A results: 1000 cycles / second TEST 2: Given a task running at priority 1 (again, the priority could just as well be 0), with no other applications running, how fast can this task bandy a message to a software interrupt handler (e.g. the port type is SOFTINT and the handler replies the message): Each cycle is defined by: A-(msg)->SoftHndlr, SoftHndlr-(msg)->A results: 1736 cycles / second TEST Conditions: The test programs are written in C. They use standard calls for everything. NOTE: The software interrupt handler is also written in C, and thus has a bit more overhead than one would normally associate with a software interrupt. However, the task-switch tester has no more overhead than equivalent assembly. All code is placed in public domain. The numbers indicated are on a standard A1000 with expansion memory (which doesn't really matter all that much), with no other applications running during the test. The code was compiled under Aztec C. -Matt !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'softint.c'" '(2220 characters)' if test -f 'softint.c' then echo shar: "will not over-write existing file 'softint.c'" else cat << \!Funky!Stuff! > 'softint.c' /* * softint [#iterations] * * Matthew Dillon * * 1000 switches/sec. (taskswitch) * 1736 softints/sec. (softint) */ typedef struct MsgPort PORT; typedef struct Task TASK; typedef struct Message MSG; typedef struct Interrupt INTR; extern TASK *CreateTask(); extern TASK *FindTask(); extern PORT *CreatePort(); extern PORT *CreateSoftPort(); extern MSG *GetMsg(); extern void *AllocMem(); extern void subtask(); extern void softhandler(); int Enable_Abort; int Iterations; PORT *Port; TASK *Task; MSG Msg; main(ac,av) char *av[]; { TASK *task; MSG *msg; if (ac == 1) { puts("softint #iterations"); exit(1); } Iterations = atoi(av[1]); Task = FindTask(NULL); Enable_Abort = 0; Port = CreateSoftPort(softhandler); puts("go"); if (task = CreateTask("switchrate.slave", 1, subtask, 2048)) Wait(SIGBREAKF_CTRL_D); puts("stop"); DeleteSoftPort(Port); puts("done"); } PORT * CreateSoftPort(handler) void (*handler)(); { register PORT *port = AllocMem(sizeof(PORT), MEMF_PUBLIC|MEMF_CLEAR); register INTR *intr = AllocMem(sizeof(INTR), MEMF_PUBLIC|MEMF_CLEAR); intr->is_Node.ln_Pri = 0; intr->is_Node.ln_Type = NT_INTERRUPT; intr->is_Data = NULL; intr->is_Code = handler; port->mp_Flags = PA_SOFTINT; port->mp_SigTask = (TASK *)intr; port->mp_Node.ln_Type = NT_MSGPORT; NewList(&port->mp_MsgList); return(port); } DeleteSoftPort(port) PORT *port; { FreeMem(port->mp_SigTask, sizeof(INTR)); FreeMem(port, sizeof(PORT)); } /* * Software interrupt handler. Called with * D0/D1/A0/A1/A5/A6 scratch as far as we are concerned. */ void softhandler() { MSG *msg; #asm movem.l D2/D3,-(sp) #endasm geta4(); if (msg = GetMsg(Port)) { if (!--Iterations) msg->mn_Length = 1; ReplyMsg(msg); } #asm movem.l (sp)+,D2/D3 #endasm } void subtask() { geta4(); Msg.mn_ReplyPort = CreatePort(NULL,0); Msg.mn_Length = 0; while (Msg.mn_Length == 0) { PutMsg(Port, &Msg); WaitPort(Msg.mn_ReplyPort); GetMsg(Msg.mn_ReplyPort); } DeletePort(Msg.mn_ReplyPort); Forbid(); Signal(Task, SIGBREAKF_CTRL_D); RemTask(NULL); /* No Permit */ } !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'softint.uue'" '(6886 characters)' if test -f 'softint.uue' then echo shar: "will not over-write existing file 'softint.uue'" else cat << \!Funky!Stuff! > 'softint.uue' begin 644 softint M```#\P`````````#``````````(```10````D@````$```/I```$4$[Z`G1. M5?_X#*T````!``AF%$AZ`)9.N@8L6$](>``!3KH,,%A/(&T`#"\H``1.N@'B M6$\I0((F0J=.NA``6$\I0((N0JR"(DAZ`1Y.N@".6$\I0((J2'H`9DZZ!>A8 M3TAX"`!(>@%`2'@``4AZ`%-.N@[H3^\`$"M`__QG"DAX(`!.NA!Z6$](>@!( M3KH%MEA/+RR"*DZZ`*A83TAZ`#E.N@6B6$].74YU<V]F=&EN="`C:71E<F%T M:6]N<P!G;P!S=VET8VAR871E+G-L879E`'-T;W``9&]N90!.50``2.<`,$AY M``$``4AX`").N@Y84$\D0$AY``$``4AX`!9.N@Y&4$\F0$(K``D7?``"``A" MJP`.)VT`"``2%7P``0`.)4L`$!5\``0`"$AJ`!1.N@]66$\@"DS?#`!.74YU M3E4``$AX`!8@;0`(+R@`$$ZZ#P903TAX`"(O+0`(3KH.^%!/3EU.=4Y5__Q( MYS``3KH!=B\L@BI.N@[^6$\K0/_\9QY3K((F9@H@;?_\,7P``0`2+RW__$ZZ M#S983TS?``Q.74YU3E4``$ZZ`3Q"IT*G3KH,JE!/*4""1$)L@DA*;()(9B1( M;((V+RR"*DZZ#MI03R\L@D1.N@\P6$\O+()$3KH.E%A/8-8O+()$3KH,^EA/ M3KH.5DAX(``O+((N3KH.[%!/0J=.N@ZZ6$].74YU3E4``$CG#"`D;0`(>`!Z M``P2`"!F!%**8/8,$@`M9@12BGH!#!(`,&TF#!(`.6X@($I2BA`02(!(P"($ MXX'0@20$YX+0@B@`F+P````P8-1*A6<&(`1$@&`"(`1,WP0P3EU.=6%P0^R! MWD7L@=ZUR68.,CP`&FL(=``BPE')__PI3X'B+'@`!"E.@>9(YX"`""X`!`$I M9Q!+^@`(3J[_XF`&0J?S7TYS0_H`($ZN_F@I0('J9@PN/``#@`=.KO^48`1. MN@`:4$].=61O<RYL:6)R87)Y`$GY``!__DYU3E4``"\*2'D``0``,"R!NL'\ M``8O`$ZZ#$103RE`@>YF%$*G2'D``0``3KH+&E!/+FR!XDYU(&R![D)H``0@ M;('N,7P``0`0(FR![C-\``$`"B!L@>(@+('BD*@`!%"`*4"!\B!L@?(@O$U! M3EA"ITZZ#-Y83R1`2JH`K&<P+RT`#"\M``@O"DZZ`+1/[P`,*7P````!@B(@ M;('N`&B````$(&R![@!H@```"F!$2&H`7$ZZ#6I83TAJ`%Q.N@S.6$\I0('V M(&R!]DJH`"1G$"!L@?8B:``D+Q%.N@H26$\O+('V+PI.N@*J4$\I;('V@?I. MN@H2(&R![B"`3KH*,B!L@>XA0``&9Q9(>`/M2'H`+$ZZ"@Y03R!L@>XA0``, M+RR!^B\L@?Y.NOOJ4$]"ITZZ"#!83R1?3EU.=2H`3E4``$CG##`D;0`0(&T` M""`H`*SE@"@`($0@*``0Y8`F0!`32(!(P-"M``Q4@"E`@@)"IR\L@@).N@KD M4$\I0((&9@A,WPPP3EU.=1`32(!(P"\`($M2B"\(+RR"!DZZ`5I/[P`,2'H! M4!`32(!(P-"L@@8O`$ZZ`8Y03R\M``PO"B\L@@9.N@%:3^\`#$*L@?XF;((& M)$L0$TB`2,`J`+"\````(&<@NKP````)9QBZO`````QG$+J\````#6<(NKP` M```*9@12BV#,#!,`(&T``(P,$P`B9C)2BR!+4HL0$$B`2,`J`&<@($I2BA"% MNKP````B9A`,$P`B9@12BV`&0BK__V`"8-)@1"!+4HL0$$B`2,`J`&<PNKP` M```@9RBZO`````EG(+J\````#&<8NKP````-9Q"ZO`````IG""!*4HH0A6#" M($I2BD(02H5F`E.+4JR!_F``_SQ"$D*G("R!_E*`Y8`O`$ZZ";!03RE`@?IF M"$*L@?Y@`/[&>@`F;((&8!H@!>6`(&R!^B&+"``O"TZZ`7!83U*`U\!2A;JL M@?YMX"`%Y8`@;('Z0K`(`&``_HX@`$SO`P``!"`((B\`#&`"$-E7R?_\9P92 M06`"0AA1R?_\3G4P/'__8`0P+P`.(&\`!$H89OQ32")O``A30!#95\C__&<" M0A`@+P`$3G4@;P`$(`@B;P`($-EF_$YU3E4``"\*)&T`"$H29R0@2E**$!!( M@$C`+P!.N@#H6$^PO/____]F"'#_)%].74YU8-A(>``*3KH`S%A/8.Q.50`` M2.<.,"1M``A"ITAZ`(Y.N@H$4$\I0((R9@A,WPQP3EU.=2!M``PB:``D+RD` M!$ZZ"GY83R@`9U)(>@!M($0O*``V3KH*4%!/)D!*@&<T2'@#[2\+3KH'-E!/ M+`!G)"`&Y8`J`"!%)6@`"`"D)48`G$AX`^U(>@`X3KH'$E!/)4``H"\$3KH* M'%A/+RR",DZZ!SA83T*L@C)@@&EC;VXN;&EB<F%R>0!724Y$3U<`*@`@;P`$ M(`A*&&;\D<`@"%.`3G5.50``2&R`&"\M``A.N@`(4$].74YU3E4``"\$*"T` M""\M``PO!$ZZ`#103[B\````"F8F(&T`#!`H``Q(@$C`"```!V<42'C__R\M M``Q.N@#^4$\H'TY=3G5@^$Y5```O"B1M``P@4K'J``1E&B`M``C`O````/\O M`"\*3KH`T%!/)%].74YU(%)2DA`M``L0@$B`2,#`O````/]@Y$Y5```O"D'L M@`(D2"!*U?P````6+PAA$%A/0>R!NK7(9>HD7TY=3G5.50``2.<(("1M``AX M`"`*9@IP_TS?!!!.74YU2BH`#&=4""H``@`,9PQ(>/__+PIA5E!/*``0*@`- M2(!(P"\`3KH%"%A/B(`(*@`!``QG"B\J``A.N@(\6$\(*@`%``QG%"\J`!). MN@+86$\O*@`23KH"(%A/0I)"J@`$0JH`"$(J``P@!&",3E7__DCG""`D;0`( M0?K_0BE(@@H(*@`$``QG"G#_3-\$$$Y=3G4(*@`"``QG,B@2F*H`""\$+RH` M"!`J``U(@$C`+P!.N@*63^\`#+"$9Q`(Z@`$``Q"DD*J``1P_V"^#*W_____ M``QF$`BJ``(`#$*20JH`!'``8*1*J@`(9@@O"DZZ`*183PQJ``$`$&8P&VT` M#___2'@``4AM__\0*@`-2(!(P"\`3KH",D_O``RPO`````%FF"`M``Q@`/]@ M)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)2DA`M``\0@$B`2,#`O````/]@ M`/\P3E4``"\*0>R``B1(2BH`#&<8U?P````60>R!NK7(90AP`"1?3EU.=6#B M0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(2'@$`$ZZ`,)83RM`__QF\``$` M$"`*T+P````.)4``""1?3EU.=35\!```$`CJ``$`#"5M__P`"!`J``U(@$C` M+P!.N@#>6$]*@&<&`"H`@``,8,Q.50``2.<`,"1L@=Y@%"92("H`!%"`+P`O M"DZZ!B)03R1+(`IFZ$*L@=Y,WPP`3EU.=4Y5```O"D'Z_\8I2((.0J<@+0`( M4(`O`$ZZ!.)03R1`2H!F"'``)%].74YU)*R!WB5M``@`!"E*@=X@"E"`8.9. M50``+RT`"&&V6$].74YU3E4``$CG`#"7RR1L@=Y@#B!M``A1B+'*9Q(F2B12 M(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2@=X@*@`$4(`O`"\*3KH%>%!/<`!@ MV$Y5```O"G(&("T`"$ZZ`K0D0-7L@>Y*K0`(;1(P+(&Z2,`B+0`(LH!L!$J2 M9A`I?`````*"$G#_)%].74YU<@8@+0`(3KH"?"!L@>XO,`@`3KH"R%A/2H!G M!'`!8`)P`?E4``"\M``A.N@*26$]*@&8.3KH"G"E`@A)P_TY=3G5P`&#X M3E4``$CG#"`H+0`(3KH`=G(&(`1.N@(F)$#5[('N2H1M#C`L@;I(P+B`;`1* MDF82*7P````"@A)P_TS?!#!.74YU,"H`!,!\``-F#"E\````!8(2</]@XB\M M`!`O+0`,+Q).N@)23^\`#"H`L+S_____9@Q.N@(6*4""$G#_8+H@!6"V3E7_ M_$AX$`!"ITZZ!-Y03RM`__P(```,9Q)*K((B9@@@+?_\3EU.=4ZZ``9P`&#T M3E4``$AX``1(>@`>3KH!["\`3KH![D_O``Q(>``!3KH`#%A/3EU.=5Y#"@!. M50``2JR""F<&(&R""DZ0+RT`"$ZZ``A83TY=3G5.5?_\+P0K;0`(__Q*K('N M9RQX`&`*+P1.N@#.6$]2A#`L@;I(P+B`;>PP+(&ZP?P`!B\`+RR![DZZ`[)0 M3TJL@@YG!B!L@@Y.D$JL@A9G"B\L@A9.N@&,6$]*K((:9PHO+((:3KH!?%A/ M2JR"'F<*+RR"'DZZ`6Q83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S M7TYS2JR!]F8J2JR"!F<B+RR"`B\L@@9.N@,\4$\@+('^4H#E@"\`+RR!^DZZ M`RA03V`.3KH#%"\L@?9.N@.06$\@+?_\+FR!XDYU*!].74YU3E4``$CG#B`H M+0`(<@8@!$ZZ`$0D0-7L@>Y*A&T.,"R!NDC`N(!L!$J29A(I?`````*"$G#_ M3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`N6$]"DG``8.!(YW``-`'$P"8!2$/& MP$A#0D/4@TA`P,%(0$)`T(),WP`.3G4B+P`$+&R!ZD[N_]PB+P`$+&R!ZD[N M_X(B+P`$+&R!ZD[N_[@L;('J3N[_RBQL@>I.[O]\(B\`!"QL@>I.[O\H3.\` M!@`$+&R!ZD[N_^(L;('J3N[_Q$SO``X`!"QL@>I.[O_02.<!!$SO((``#"QL M@>9.KO^43-\@@$YU3OH``B)O``0L;('F3N[^8DY5``!(YP@@2'C__TZZ`-!8 M3R@`L+S_____9@IP`$S?!!!.74YU2'D``0`!2'@`(DZZ`+A03R1`2H!F#"\$ M3KH!SEA/<`!@UB5M``@`"A5M``\`"15\``0`"$(J``X51``/0J=.N@%X6$\E M0``02JT`"&<*+PI.N@!:6$]@"DAJ`!1.N@&F6$\@"F"23E4``"\*)&T`"$JJ M``IG""\*3KH!NEA/%7P`_P`()7S_____`!1P`!`J``\O`$ZZ`5)83TAX`"(O M"DZZ`3)03R1?3EU.=2)O``0L;('F3N[^GB`O``0L;('F3N[^MD[Z``),[P`# M``0L;('F3N[_.DY5_^!(YP`P("T`%%:`P+S____\*T``%$'M_^!#[(&\<`<@ MV5'(__PK;0`4__Q(;?_@3KH`HEA/)D!*@&8*<`!,WPP`3EU.=21K`!`E:P`8 M`#H@*@`ZT*T`%"5``#XE0``V%7P``0`(%6T`#P`))6T`"``*2&H`2DZZ`+18 M3R\+2&H`2DZZ`"I03T*G+RT`$"\*3KH`*D_O``P@"F"B3E4``"\M``A.N@#" M6$].74YU3.\#```$+&R!YD[N_Q!(YP`P3.\.```,+&R!YDZN_N9,WPP`3G4@ M;P`$+&R!YD[N_R).^@`"(F\`!"QL@>9.[O[:3OH``BQL@>9.[O]\3OH``B)O M``0@+P`(+&R!YD[N_RX@+P`$+&R!YD[N_K!.^@`"(&\`!"QL@>9.[OZ,(&\` M!""(6)!"J``$(4@`"$YU+&R!YB)O``0@+P`(3N[]V$SO`P``!"QL@>9.[OZ2 M(F\`!"QL@>9.[OZ8(F\`!"QL@>9.[O[@3OH``B)O``0L;('F3N[^ADSO``,` M!"QL@>9.[O[.(F\`!"`O``@L;('F3N[^O"`O``0L;('F3N[^PD[Z``(@;P`$ M+&R!YD[N_H!,[P,```0L;((R3N[_H"!O``0L;((R3N[_IB!O``0L;((R3N[_ ML@```^P````!`````0```NH````````#\@```^H```!W```````````````` M`0`````!``````````````````````$!`````0`````````````````````! M`@````$````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M````````````````````````````````%`````````````````````(``0`! >````7``!``````````````/R```#ZP````$```/R ` end !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'taskswitch.c'" '(1265 characters)' if test -f 'taskswitch.c' then echo shar: "will not over-write existing file 'taskswitch.c'" else cat << \!Funky!Stuff! > 'taskswitch.c' /* * taskswitch [#iterations] * * Matthew Dillon * * 1000 switches/sec. (taskswitch) rough figures * 1736 softints/sec. (softint) */ typedef struct MsgPort PORT; typedef struct Task TASK; typedef struct Message MSG; extern TASK *CreateTask(); extern PORT *CreatePort(); extern MSG *GetMsg(); extern void subtask(); int Enable_Abort; PORT *Port; MSG Msg; main(ac,av) char *av[]; { int i, n; TASK *task; MSG *msg; if (ac == 1) { puts("taskswitch #iterations"); exit(1); } n = atoi(av[1]); Enable_Abort = 0; if (Port = CreatePort(NULL,0)) { if (task = CreateTask("taskswitch.slave", 0, subtask, 2048)) { puts("go"); for (i = 0; i < n; ++i) { WaitPort(Port); ReplyMsg(GetMsg(Port)); } puts("stop"); WaitPort(Port); msg = GetMsg(Port); msg->mn_Length = 1; ReplyMsg(msg); WaitPort(Port); } DeletePort(Port); } puts("done"); } void subtask() { geta4(); Msg.mn_ReplyPort = CreatePort(NULL,0); Msg.mn_Length = 0; while (Msg.mn_Length == 0) { PutMsg(Port, &Msg); WaitPort(Msg.mn_ReplyPort); GetMsg(Msg.mn_ReplyPort); } DeletePort(Msg.mn_ReplyPort); Forbid(); PutMsg(Port, &Msg); RemTask(NULL); /* No Permit */ } !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'taskswitch.uue'" '(6691 characters)' if test -f 'taskswitch.uue' then echo shar: "will not over-write existing file 'taskswitch.uue'" else cat << \!Funky!Stuff! > 'taskswitch.uue' begin 644 taskswitch M```#\P`````````#``````````(```0L````D`````$```/I```$+$[Z`@!. M5?_P#*T````!``AF%$AZ`.A.N@6X6$](>``!3KH+O%A/(&T`#"\H``1.N@%N M6$\K0/_X0JR"(D*G0J=.N@VH4$\I0((F9P``HDAX"`!(>@#>0J=(>@"Y3KH. MB$_O`!`K0/_T9WI(>@"X3KH%8%A/0JW__&`@+RR")DZZ#_I83R\L@B9.N@]Z M6$\O`$ZZ#\I83U*M__P@+?_\L*W_^&W62'H`@4ZZ!2983R\L@B9.N@_&6$\O M+((F3KH/1EA/*T#_\"!M__`Q?``!`!(O+?_P3KH/AEA/+RR")DZZ#YI83R\L M@B9.N@V,6$](>@`\3KH$W%A/3EU.=71A<VMS=VET8V@@(VET97)A=&EO;G,` M=&%S:W-W:71C:"YS;&%V90!G;P!S=&]P`&1O;F4``$Y5``!.N@$\0J="ITZZ M#*I03RE`@CQ";()`2FR"0&8D2&R"+B\L@B9.N@[:4$\O+((\3KH/%%A/+RR" M/$ZZ#I183V#6+RR"/$ZZ#/I83TZZ#E9(;((N+RR")DZZ#JA03T*G3KH.NEA/ M3EU.=4Y5``!(YPP@)&T`"'@`>@`,$@`@9@12BF#V#!(`+68$4HIZ`0P2`#!M M)@P2`#EN("!*4HH0$$B`2,`B!..!T($D!.>"T((H`)B\````,*H5G!B`$ M1(!@`B`$3-\$,$Y=3G5A<$/L@=Y%[('>M<EF#C(\`!AK"'0`(L)1R?_\*4^! MXBQX``0I3H'F2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH M*4"!ZF8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y. M=4Y5```O"DAY``$``#`L@;K!_``&+P!.N@Q$4$\I0('N9A1"ITAY``$``$ZZ M"QI03RYL@>).=2!L@>Y":``$(&R"\13KH*$EA/ M+RR!]B\*3KH"JE!/*6R!]H'Z3KH*$B!L@>X@@$ZZ"C(@;('N(4``!F<62'@# M[4AZ`"Q.N@H.4$\@;('N(4``#"\L@?HO+('^3KK\7E!/0J=.N@@P6$\D7TY= M3G4J`$Y5``!(YPPP)&T`$"!M``@@*`"LY8`H`"!$("@`$.6`)D`0$TB`2,#0 MK0`,5(`I0(("0J<O+(("3KH*Y%!/*4""!F8(3-\,,$Y=3G40$TB`2,`O`"!+ M4H@O""\L@@9.N@%:3^\`#$AZ`5`0$TB`2,#0K((&+P!.N@&.4$\O+0`,+PHO M+((&3KH!6D_O``Q"K('^)FR"!B1+$!-(@$C`*@"PO````"!G(+J\````"6<8 MNKP````,9Q"ZO`````UG"+J\````"F8$4HM@S`P3`"!M``",#!,`(F8R4HL@ M2U*+$!!(@$C`*@!G("!*4HH0A;J\````(F80#!,`(F8$4HM@!D(J__]@`F#2 M8$0@2U*+$!!(@$C`*@!G,+J\````(&<HNKP````)9R"ZO`````QG&+J\```` M#6<0NKP````*9P@@2E**$(5@PB!*4HI"$$J%9@)3BU*L@?Y@`/\\0A)"IR`L M@?Y2@.6`+P!.N@FP4$\I0('Z9@A"K('^8`#^QGH`)FR"!F`:(`7E@"!L@?HA MBP@`+PM.N@%P6$]2@-?`4H6ZK('^;>`@!>6`(&R!^D*P"`!@`/Z.(`!,[P,` M``0@""(O``Q@`A#95\G__&<&4D%@`D(84<G__$YU,#Q__V`$,"\`#B!O``1* M&&;\4T@B;P`(4T`0V5?(__QG`D(0("\`!$YU(&\`!"`((F\`"!#99OQ.=4Y5 M```O"B1M``A*$F<D($I2BA`02(!(P"\`3KH`Z%A/L+S_____9@AP_R1?3EU. M=6#82'@`"DZZ`,Q83V#L3E4``$CG#C`D;0`(0J=(>@".3KH*!%!/*4""*F8( M3-\,<$Y=3G4@;0`,(F@`)"\I``1.N@IB6$\H`&=22'H`;2!$+R@`-DZZ"C10 M3R9`2H!G-$AX`^TO"TZZ!S903RP`9R0@!N6`*@`@125H``@`I"5&`)Q(>`/M M2'H`.$ZZ!Q)03R5``*`O!$ZZ"@!83R\L@BI.N@<X6$]"K((J8(!I8V]N+FQI M8G)A<GD`5TE.1$]7`"H`(&\`!"`(2AAF_)'`(`A3@$YU3E4``$AL@!@O+0`( M3KH`"%!/3EU.=4Y5```O!"@M``@O+0`,+P1.N@`T4$^XO`````IF)B!M``P0 M*``,2(!(P`@```=G%$AX__\O+0`,3KH`_E!/*!].74YU8/A.50``+PHD;0`, M(%*QZ@`$91H@+0`(P+P```#_+P`O"DZZ`-!03R1?3EU.=2!24I(0+0`+$(!( M@$C`P+P```#_8.1.50``+PI![(`")$@@2M7\````%B\(81!83T'L@;JUR&7J M)%].74YU3E4``$CG""`D;0`(>``@"F8*</],WP003EU.=4HJ``QG5`@J``(` M#&<,2'C__R\*85903R@`$"H`#4B`2,`O`$ZZ!0A83XB`""H``0`,9PHO*@`( M3KH"/%A/""H`!0`,9Q0O*@`23KH"V%A/+RH`$DZZ`B!83T*20JH`!$*J``A" M*@`,(`1@C$Y5__Y(YP@@)&T`"$'Z_T(I2((*""H`!``,9PIP_TS?!!!.74YU M""H``@`,9S(H$IBJ``@O!"\J``@0*@`-2(!(P"\`3KH"ED_O``RPA&<0".H` M!``,0I)"J@`$</]@O@RM_____P`,9A`(J@`"``Q"DD*J``1P`&"D2JH`"&8( M+PI.N@"D6$\,:@`!`!!F,!MM``___TAX``%(;?__$"H`#4B`2,`O`$ZZ`C)/ M[P`,L+P````!9I@@+0`,8`#_8"2J``@P*@`02,#0J@`()4``!`CJ``(`#"!2 M4I(0+0`/$(!(@$C`P+P```#_8`#_,$Y5```O"D'L@`(D2$HJ``QG&-7\```` M%D'L@;JUR&4(<``D7TY=3G5@XD*20JH`!$*J``@@"F#J3E7__"\*)&T`"$AX M!`!.N@#"6$\K0/_\9A@U?``!`!`@"M"\````#B5```@D7TY=3G4U?`0``!`( MZ@`!``PE;?_\``@0*@`-2(!(P"\`3KH`WEA/2H!G!@`J`(``#&#,3E4``$CG M`#`D;('>8!0F4B`J``10@"\`+PI.N@8B4$\D2R`*9NA"K('>3-\,`$Y=3G5. M50``+PI!^O_&*4B"#D*G("T`"%"`+P!.N@3B4$\D0$J`9@AP`"1?3EU.=22L M@=XE;0`(``0I2H'>(`I0@&#F3E4``"\M``AAMEA/3EU.=4Y5``!(YP`PE\LD M;('>8`X@;0`(48BQRF<2)DHD4B`*9NYP_TS?#`!.74YU(`MG!":28`0I4H'> M("H`!%"`+P`O"DZZ!7A03W``8-A.50``+PIR!B`M``A.N@*T)$#5[('N2JT` M"&T2,"R!NDC`(BT`"+*`;`1*DF80*7P````"@A)P_R1?3EU.=7(&("T`"$ZZ M`GP@;('N+S`(`$ZZ`LA83TJ`9P1P`6`"<`!@UDY5```O+0`(3KH"DEA/2H!F M#DZZ`IPI0((2</].74YU<`!@^$Y5``!(YPP@*"T`"$ZZ`'9R!B`$3KH")B1` MU>R![DJ$;0XP+(&Z2,"X@&P$2I)F$BE\`````H(2</],WP0P3EU.=3`J``3` M?``#9@PI?`````6"$G#_8.(O+0`0+RT`#"\23KH"4D_O``PJ`+"\_____V8, M3KH"%BE`@A)P_V"Z(`5@MDY5__Q(>!``0J=.N@3>4$\K0/_\"```#&<22JR" M(F8(("W__$Y=3G5.N@`&<`!@]$Y5``!(>``$2'H`'DZZ`>PO`$ZZ`>Y/[P`, M2'@``4ZZ``Q83TY=3G5>0PH`3E4``$JL@@IG!B!L@@I.D"\M``A.N@`(6$]. M74YU3E7__"\$*VT`"/_\2JR![F<L>`!@"B\$3KH`SEA/4H0P+(&Z2,"X@&WL M,"R!NL'\``8O`"\L@>Y.N@.R4$]*K((.9P8@;((.3I!*K((69PHO+((63KH! MC%A/2JR"&F<*+RR"&DZZ`7Q83TJL@AYG"B\L@AY.N@%L6$\L>``$""X`!`$I M9Q0O#4OZ``I.KO_B*E]@!D*G\U].<TJL@?9F*DJL@@9G(B\L@@(O+((&3KH# M/%!/("R!_E*`Y8`O`"\L@?I.N@,H4$]@#DZZ`Q0O+('V3KH#D%A/("W__"YL M@>).=2@?3EU.=4Y5``!(YPX@*"T`"'(&(`1.N@!$)$#5[('N2H1M#C`L@;I( MP+B`;`1*DF82*7P````"@A)P_TS?!'!.74YU,"H`!,!\@`!F""\23KH`+EA/ M0I)P`&#@2.=P`#0!Q,`F`4A#QL!(0T)#U(-(0,#!2$!"0-""3-\`#DYU(B\` M!"QL@>I.[O_<(B\`!"QL@>I.[O^"(B\`!"QL@>I.[O^X+&R!ZD[N_\HL;('J M3N[_?"(O``0L;('J3N[_*$SO``8`!"QL@>I.[O_B+&R!ZD[N_\1,[P`.``0L M;('J3N[_T$CG`01,[R"```PL;('F3J[_E$S?((!.=4[Z``(B;P`$+&R!YD[N M_F).50``2.<(($AX__].N@#06$\H`+"\_____V8*<`!,WP003EU.=4AY``$` M`4AX`").N@"X4$\D0$J`9@PO!$ZZ`<Y83W``8-8E;0`(``H5;0`/``D5?``$ M``A"*@`.%40`#T*G3KH!>%A/)4``$$JM``AG"B\*3KH`6EA/8`I(:@`43KH! MIEA/(`I@DDY5```O"B1M``A*J@`*9P@O"DZZ`;I83Q5\`/\`""5\_____P`4 M<``0*@`/+P!.N@%26$](>``B+PI.N@$R4$\D7TY=3G4B;P`$+&R!YD[N_IX@ M+P`$+&R!YD[N_K9.^@`"3.\``P`$+&R!YD[N_SI.5?_@2.<`,"`M`!16@,"\ M_____"M``!1![?_@0^R!O'`'(-E1R/_\*VT`%/_\2&W_X$ZZ`*)83R9`2H!F M"G``3-\,`$Y=3G4D:P`0)6L`&``Z("H`.M"M`!0E0``^)4``-A5\``$`"!5M M``\`"25M``@`"DAJ`$I.N@"T6$\O"TAJ`$I.N@`J4$]"IR\M`!`O"DZZ`"I/ M[P`,(`I@HDY5```O+0`(3KH`PEA/3EU.=4SO`P``!"QL@>9.[O\02.<`,$SO M#@``#"QL@>9.KO[F3-\,`$YU(&\`!"QL@>9.[O\B3OH``B)O``0L;('F3N[^ MVD[Z``(L;('F3N[_?$[Z``(B;P`$("\`""QL@>9.[O\N("\`!"QL@>9.[OZP M3OH``B!O``0L;('F3N[^C"!O``0@B%B00J@`!"%(``A.=2QL@>8B;P`$("\` M"$[N_=A,[P,```0L;('F3N[^DB)O``0L;('F3N[^F")O``0L;('F3N[^X$[Z M``(B;P`$+&R!YD[N_H9,[P`#``0L;('F3N[^SD[Z``(@;P`$+&R!YD[N_H!, M[P,```0L;((J3N[_H"!O``0L;((J3N[_IB!O``0L;((J3N[_L@```^P````! M`````0```G8````````#\@```^H```!W`````````````````0`````!```` M``````````````````$!`````0`````````````````````!`@````$````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M````````````````````%`````````````````````(``0`!````7``!```` 5``````````/R```#ZP````$```/R ` end !Funky!Stuff! fi # end of overwriting check exit 0 # End of shell archive
haitex@pnet01.cts.com (Wade Bickel) (03/29/88)
dillon@CORY.BERKELEY.EDU (Matt Dillon) writes: > > Here are some timing tests on the relative speed of message >passing and software interrupt overhead. The code is included. >(It's too small to bother the moderators). > > -Matt > > >TEST 1: > Given two tasks running at priority 0 (the priority doesn't > really effect the results) with no other applications running, > how fast can these two tasks bandy a message back and forth? > > Each cycle is defined by: A-(msg)->B, B-(msg)->A > > results: 1000 cycles / second > >TEST 2: > Given a task running at priority 1 (again, the priority could > just as well be 0), with no other applications running, > how fast can this task bandy a message to a software interrupt > handler (e.g. the port type is SOFTINT and the handler replies > the message): > > Each cycle is defined by: A-(msg)->SoftHndlr, SoftHndlr-(msg)->A > > results: 1736 cycles / second > >TEST Conditions: > > The test programs are written in C. They use standard calls for > everything. NOTE: The software interrupt handler is also written > in C, and thus has a bit more overhead than one would normally > associate with a software interrupt. However, the task-switch > tester has no more overhead than equivalent assembly. In my interrupt server I have been useing shared memory with a few conventions applied to prevent conflicts. Seems to me that 1700 cycles is at least two orders of magnitude smaller than the possble communications rate I can achieve. Are you sure this is correct? Thanks, Wade. UUCP: {cbosgd, hplabs!hp-sdd, sdcsvax, nosc}!crash!pnet01!haitex ARPA: crash!pnet01!haitex@nosc.mil INET: haitex@pnet01.CTS.COM
dillon@CORY.BERKELEY.EDU (Matt Dillon) (03/30/88)
:>TEST 1: :> Each cycle is defined by: A-(msg)->B, B-(msg)->A :> results: 1000 cycles / second :>TEST 2: :> Each cycle is defined by: A-(msg)->SoftHndlr, SoftHndlr-(msg)->A :> results: 1736 cycles / second : In my interrupt server I have been useing shared memory with a few :conventions applied to prevent conflicts. Seems to me that 1700 cycles is :at least two orders of magnitude smaller than the possble communications rate :I can achieve. Are you sure this is correct? I think you didn't read my test descriptions. The only type of interrupt I tested was a SOFTWARE interrupt generated continuously from a task. I did NOT test HARDWARE interrupts. Anybody who has traced the code can tell you that CA did a slam-bang job on the hardware interrupts.... very little overhead for a lot of nice features. Assuming an interrupt handler doesn't have to PutMsg() or Signal() anybody, it goes extremely fast.... essentially the standard 68000 interrupt overhead plus a small number of instructions. Throughput of at least 8000+ interrupts / sec (average), assuming your interrupt handler doesn't need to do much. (that is a rough figure, it is probably even faster!) If your hardware interrupt *does* PutMsg() or Signal() something, we are still talking 2500+ interrupts / sec (average). -Matt