|
*** Documento en elaboración *** v183
Para el Test de Reentrancia tomanos la función
BScript
recursiva "mpcdown" (countdown):
(de mpcdown (n) (if (< n 1) 0 (mpcdown (- n 1))))
y la partimos en dos partes que colaboran entre si:
(de mpbcdown (n) (if (< n 1) 0 (mpscdown (- n 1))))
(de mpscdown (n) (if (< n 1) 0 (mpbcdown (- n 1))))
bcdown se corre en el Browser y scdown se
corre en el Server. La colaboración entre ambas requiere invocaciones
remotas reentrantes.
Así, la ejecución del comando en el Browser
produce 500 invocaciones remotas sincrónicas desde el Browser al
Server y 500 invocaciones remotas sincrónicas desde el Server al Browser.
Como veremos mas abajo implementamos las funciones BScript en C#
Performance
En la versión actual (11.0215) utilizando un enlace
Internet de 1 Mbps y un servidor de 1 GHz el tiempo promedio para el round-trip de cada
invocación remota es 20 msec (20 milisegundos).
| En una LAN Wi-Fi con un servidor de 2.8 GHz el tiempo promedio
para el round-trip de cada invocación remota es 4.5 msec (4.5
milisegundos). |
Este valor promedio es el que utilizamos en las decisiones de distribución de
funciones en una aplicación.
| Esta cifra promedio puede ser reducida en futuras versiones. |
Implementación de las funciones BScript en C#
El siguiente codigo muestra lo fácil que resulta implementar
funciones BScript en C#.
El codigo C# para la función mpbcdown que se corre en el Browser es:
OB.RegSvc("mpbcdown", cdown);
......
IBChannelB2S IBChannelB2S = ...
......
private BSX cdown(ENV Env, BSX bsx)
{
Number n = bsx;
if (n < 1)
{
return 0;
}
Number ret = -999;
BL PROGL = OB.BL("mpscdown", n - 1);
return Number.Convert(
IBChannelB2S.EvalBSX2(PROGL).Value);
}
y el codigo C# para la función mpscdown que se corre en
el Server es:
OB.RegSvc( "mpscdown", cdown);
..............
BChannelS2B BChannelS2B = ....
.............
private BSX cdown(ENV Env, BSX bsx)
{
Number n = bsx;
if (n < 1)
return 0;
Number ret = -999;
BL PROGL = OB.BL("mpbcdown", n - 1);
return Number.Convert(BChannelS2B.EvalBSX2(Env, PROGL).Value);
}
Ver también
|