Difference between revisions of "LSL Script Efficiency/es"

From Second Life Wiki
Jump to navigation Jump to search
(New page: {{Multi-lang}} <div style="float:right;">__TOC__</div>{{LSL Header}} <div id="box"> == Qué es la eficiencia == <div style="padding: 0.5em;"> Efficiency is how much resource a particular...)
 
m
 
(11 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{Multi-lang}}
{{Multi-lang}}{{LSL Header{{#var:lang}}}}
<div style="float:right;">__TOC__</div>{{LSL Header}}
<div style="float:right;">__TOC__</div>


<div id="box">
<div id="box">
Line 6: Line 6:
<div style="padding: 0.5em;">
<div style="padding: 0.5em;">


Efficiency is how much resource a particular script uses to accomplish a goalThis often goes hand-in-hand with speed of execution, but not always.
La eficiencia es la cantidad de recursos que un script específico usa para obtener un objetivoLa eficiencia va de la mano con la velocidad de ejecución, pero no siempre.


Things to watch out for, in rough order of importance:
Este atento de los siguientes puntos, en orden de importancia aproximado:


* Using a lot of scripts to accomplish somethingSee Efficient Design.
* Usar muchos scripts para lograr algoConsulte Diseño Eficiente.
* [[llSleep]] - This function uses up 0.2 to 0.3 ms per frame while the script sleeps, timers are much better.
* [[llSleep]] - Esta función usa de 0.2 a 0.3 ms por marco mientras que el script duerme, los  temporizadores son mejores.
* Short frequency timers (<5 sec)
* Temporizador de frequecia corta (<5 sec)
* Listen - especially to the 0 channel
* Escuchar - especialmente al canal 0  
* Changing textures often (Others have to download them)
* Cambiar texturas con frecuencia (Otros tienen que descargarlos)
* Inappropriate use of server/physical rotations instead of omega
* Uso poco apropiado de rotaciones físicas/de servidor en vez de omega
* Event handlers which are not needed (touch, collision, ...)
* Manejadores de eventos que no son necesarios (tocar, colisión, ...)
* Large amount of email or IM
* Cantidad grande de correo electrónico o mensajes instantáneos
* Inefficient algorithms (like linear search)
* Algoritmos ineficaces  (como la búsqueda lineal)
* Busy (polling) loops
* Bucles de llamadas selectivas ocupadas


</div></div>
</div></div>
<div id="box">
<div id="box">


== Diseño eficaz ==
== Diseño eficiente ==
<div style="padding: 0.5em;">
<div style="padding: 0.5em;">


Each idle script in an object adds 0.001 to 0.003 milliseconds per frame of script time usageFewer scripts is better.
Cada script inactivo en un objecto añade de 0.001 a 0.003 milisegundos por marco de uso de tiempo de script. Menos scripts son mejor.
 
* Si necesita tener varios "botones" no ponga un script en cada primEn su lugar use [[llDetectedLinkNumber]] para detectar cual botón se tocó en su script principal.
* Si necesita cambiar el color, alpha o textura de un prim hijo no ponga un script en cada prim. En su lugar use [[llSetLinkAlpha]], [[llSetLinkColor]], [[llSetLinkTexture]], o [[llSetLinkPrimitiveParams]].
* '''Nunca''' ponga un script en cada prim (de un conjunto de enlaces grande) que escuche en el canal 0 (o cualquier otro canal).  Esto es lo peor que puede hacer para la eficiencia.  Desafortunadamente es muy común.
* Considera usar [[XyzzyText]] en vez de [[XyText]].
 
Lo más importante es que si te encuentras tentado de poner un script en cada prim, que pares y analizes como puedes hacerlo de otra manera con menos scripts.  Casi siempre hay una alternativa.  Está en tus manos decidir si la alternativa es viable para tu aplicación.


* If you need to have a bunch of "buttons", don't put a script in each prim.  Use [[llDetectedLinkNumber]] to detect which button was touched from your main script instead. 
* If you need to change color, alpha, or texture of child prims, do not put a script in each prim.  Instead use [[llSetLinkAlpha]], [[llSetLinkColor]], [[llSetLinkTexture]], or [[llSetLinkPrimitiveParams]].
* '''Never''' put a script in each prim (of a large linkset) that listens on channel 0 (or any other channel).  This is probably the worst thing you can do for efficiency.  Unfortunately it is all too common.
* Consider using [[XyzzyText]] instead of [[XyText]].


The bottom line is, if you find yourself tempted to put a script in each prim, stop and think about how you could do it differently with fewer scripts.  There is almost always an alternative.  It is up to you to decide whether the alternative is a viable one for your application.


</div></div>
</div></div>
Line 41: Line 43:
== Micro-optimización ==
== Micro-optimización ==


There are many ways to speed up scripts, such as using ++a instead of a++, however, most of these micro optimizations might not hold true in the future.
Hay muchas maneras de acelerar los scripts, como usar ++a en vez de a++.  Sin embargo, muchas de estas micro-optimizaciones no serán ciertas en el futuro.
 


== Cuán Rápido Corre el Código ==
== Cuán Rápido Corre el Código ==
<div style="padding: 0.5em;">
<div style="padding: 0.5em;">


The following code will get the time for each function call in millis.
El código siguiente obtendrá el tiempo de cada función llamada en millis.  


Please first propose changes to the [[Talk:LSL_Script_Efficiency|discussion]] tab. Please do not change the code here without discussion, as any small change could reduce the accuracy of measurements. Please note this code and its comments should exactly match the code and comments presented by the [[Efficiency Tester]] page.
Primero proponga cambios en la pestaña [[Talk:LSL_Script_Efficiency|discussion]]. No cambie el código aqui sin discutirlo, ya que cualquier cambio pequeño puede reducir la exactitud de las medidas. Sírvase notar que este código y sus comentarios deben igualar exactamente el código y comentarios en la página [[Efficiency Tester]].


Thanks to {{User|Xaviar Czervik}} for the original code, thanks to {{User|Strife Onizuka}} for tuning the code to produce more accurate measurements, and thanks to the other contributors listed in the history of this article.
Gracias a {{User|Xaviar Czervik}} por el código original, gracias a {{User|Strife Onizuka}} por optimar el código para producir medidas correctas, y gracias a los otros contribudores mencionados en la historia de este artículo.


<pre>
<pre>
//IMPORTANT: Only perform tests in an empty region.
//IMPORTANT: Solo haga pruebas en una región vacía.  
// To reduce contamination and be sure to wearing no attachments.
// Para reducir la contaminación asegure no tener accesorios puestos.  
// Preferably do tests in a private sim with one on it.
// Haga las pruebas preferiblemente en un sim privado con uno en él.
// Don't move while performing the test.
// No se mueva mientras hace la prueba.
// There is a margin of error so run the tests multiple times to determine it.
// Hay un margen de error así que corra varias pruebas para determinarlo.  


integer time() { // count milliseconds since the day began
integer time() { // cuenta milisegundos desde que comenzó el día
     string stamp = llGetTimestamp(); // "YYYY-MM-DDThh:mm:ss.ff..fZ"
     string stamp = llGetTimestamp(); // "YYYY-MM-DDThh:mm:ss.ff..fZ"
     return (integer) llGetSubString(stamp, 11, 12) * 3600000 + // hh
     return (integer) llGetSubString(stamp, 11, 12) * 3600000 + // hh
Line 71: Line 72:
     llOwnerSay((string) llGetFreeMemory());
     llOwnerSay((string) llGetFreeMemory());


     //test variables
     //variables de prueba
     float counter;
     float counter;


     //framework variables
     //variables de marco de trabajo
     float i = 0;
     float i = 0;
     float j = 0;
     float j = 0;
     float max = 10000; // 2ms of work takes 20 seconds to repeat 10,000 times, plus overhead
     float max = 10000; // 2ms de trabajo toma 20 segundos para repetir 10,000 veces, más coste en tiempo
 
     float t0 = time();
     float t0 = time();
     do {
     do {
Line 88: Line 88:
     float t1 = time();
     float t1 = time();
     do ; while (++j < max);
     do ; while (++j < max);
     float t2 = time();//remove the time required by the framework
     float t2 = time();//remueve el tiempo requerido por el marco de trabajo
     float elapsed = ((t1 - t0) - (t2 - t1))/max;
     float elapsed = ((t1 - t0) - (t2 - t1))/max;
     llOwnerSay("The function in the loop took a total of " + (string)elapsed + " milliseconds.");
     llOwnerSay("The function in the loop took a total of " + (string)elapsed + " milliseconds.");
Line 101: Line 101:
<div style="padding: 0.5em;">
<div style="padding: 0.5em;">


The following data was collected using the above function in a recently deployed empty (though not private) sim, with only that one script running in a HUD attachment. 20 tests of each were run and averaged.
Los siguientes datos fue compilada usando la función arriba en un sim vacío recientemente lanzado (aunque no privado) con solo un script corriendo un accesorio HUD. 20 pruebas de cada uno se corrieron y promediaron.
   ++a:    0.173780 ms    std. dev.:  0.003393 ms
   ++a:    0.173780 ms    Desviación típica:  0.003393 ms
   a += 1:  0.181720 ms    std. dev.:  0.013267 ms
   a += 1:  0.181720 ms    Desviación típica:  0.013267 ms
   a++:    0.243500 ms    std. dev.:  0.013816 ms
   a++:    0.243500 ms    Desviación típica:  0.013816 ms
Thus a++ takes 40% longer to execute than ++a (rough estimate).
Así que a++ toma 40% más tiempo para ejecutar que ++a (estimación aproximada).


While the following data is correct, the function above was not used. A slightly less optimized version written by {{User|Xaviar Czervik}} was used. If someone could please repeat the tests with the function above.
A pesar que los datos siguientes son correctos, no se usó la funcion mencionada anteriormente. Se usó una versión menos optimada escrita por {{User|Xaviar Czervik}}. Sírvase alguien repetir las pruebas de la función arriba.


   ++a:    0.364700 millis
   ++a:    0.364700 millis
Line 113: Line 113:
   a++:    0.413700 millis
   a++:    0.413700 millis


Probando la misma funcion en bucles for (for loops):
Probando la misma función en bucles for (for loops):
   ++a:    0.358370 millis
   ++a:    0.358370 millis
   a += 1:  0.351200 millis
   a += 1:  0.351200 millis

Latest revision as of 16:32, 24 October 2008

Qué es la eficiencia

La eficiencia es la cantidad de recursos que un script específico usa para obtener un objetivo. La eficiencia va de la mano con la velocidad de ejecución, pero no siempre.

Este atento de los siguientes puntos, en orden de importancia aproximado:

  • Usar muchos scripts para lograr algo. Consulte Diseño Eficiente.
  • llSleep - Esta función usa de 0.2 a 0.3 ms por marco mientras que el script duerme, los temporizadores son mejores.
  • Temporizador de frequecia corta (<5 sec)
  • Escuchar - especialmente al canal 0
  • Cambiar texturas con frecuencia (Otros tienen que descargarlos)
  • Uso poco apropiado de rotaciones físicas/de servidor en vez de omega
  • Manejadores de eventos que no son necesarios (tocar, colisión, ...)
  • Cantidad grande de correo electrónico o mensajes instantáneos
  • Algoritmos ineficaces (como la búsqueda lineal)
  • Bucles de llamadas selectivas ocupadas

Diseño eficiente

Cada script inactivo en un objecto añade de 0.001 a 0.003 milisegundos por marco de uso de tiempo de script. Menos scripts son mejor.

  • Si necesita tener varios "botones" no ponga un script en cada prim. En su lugar use llDetectedLinkNumber para detectar cual botón se tocó en su script principal.
  • Si necesita cambiar el color, alpha o textura de un prim hijo no ponga un script en cada prim. En su lugar use llSetLinkAlpha, llSetLinkColor, llSetLinkTexture, o llSetLinkPrimitiveParams.
  • Nunca ponga un script en cada prim (de un conjunto de enlaces grande) que escuche en el canal 0 (o cualquier otro canal). Esto es lo peor que puede hacer para la eficiencia. Desafortunadamente es muy común.
  • Considera usar XyzzyText en vez de XyText.

Lo más importante es que si te encuentras tentado de poner un script en cada prim, que pares y analizes como puedes hacerlo de otra manera con menos scripts. Casi siempre hay una alternativa. Está en tus manos decidir si la alternativa es viable para tu aplicación.


Micro-optimización

Hay muchas maneras de acelerar los scripts, como usar ++a en vez de a++. Sin embargo, muchas de estas micro-optimizaciones no serán ciertas en el futuro.

Cuán Rápido Corre el Código

El código siguiente obtendrá el tiempo de cada función llamada en millis.

Primero proponga cambios en la pestaña discussion. No cambie el código aqui sin discutirlo, ya que cualquier cambio pequeño puede reducir la exactitud de las medidas. Sírvase notar que este código y sus comentarios deben igualar exactamente el código y comentarios en la página Efficiency Tester.

Gracias a Xaviar Czervik por el código original, gracias a Strife Onizuka por optimar el código para producir medidas correctas, y gracias a los otros contribudores mencionados en la historia de este artículo.

//IMPORTANT: Solo haga pruebas en una región vacía. 
// Para reducir la contaminación asegure no tener accesorios puestos. 
// Haga las pruebas preferiblemente en un sim privado con uno en él.
// No se mueva mientras hace la prueba.
// Hay un margen de error así que corra varias pruebas para determinarlo. 

integer time() { // cuenta milisegundos desde que comenzó el día
    string stamp = llGetTimestamp(); // "YYYY-MM-DDThh:mm:ss.ff..fZ"
    return (integer) llGetSubString(stamp, 11, 12) * 3600000 + // hh
           (integer) llGetSubString(stamp, 14, 15) * 60000 +  // mm
           llRound((float)llGetSubString(stamp, 17, -2) * 1000000.0)/1000; // ss.ff..f
}

default {
  state_entry() {
    llOwnerSay((string) llGetFreeMemory());

    //variables de prueba
    float counter;

    //variables de marco de trabajo
    float i = 0;
    float j = 0;
    float max = 10000; // 2ms de trabajo toma 20 segundos para repetir 10,000 veces, más coste en tiempo 
    float t0 = time();
    do {

      //test
      counter += 1;
      
    }while (++i < max);
    float t1 = time();
    do ; while (++j < max);
    float t2 = time();//remueve el tiempo requerido por el marco de trabajo
    float elapsed = ((t1 - t0) - (t2 - t1))/max;
    llOwnerSay("The function in the loop took a total of " + (string)elapsed + " milliseconds.");
  }
}

Eficiencia

Los siguientes datos fue compilada usando la función arriba en un sim vacío recientemente lanzado (aunque no privado) con solo un script corriendo un accesorio HUD. 20 pruebas de cada uno se corrieron y promediaron.

  ++a:     0.173780 ms    Desviación típica:  0.003393 ms
  a += 1:  0.181720 ms    Desviación típica:  0.013267 ms
  a++:     0.243500 ms    Desviación típica:  0.013816 ms

Así que a++ toma 40% más tiempo para ejecutar que ++a (estimación aproximada).

A pesar que los datos siguientes son correctos, no se usó la funcion mencionada anteriormente. Se usó una versión menos optimada escrita por Xaviar Czervik. Sírvase alguien repetir las pruebas de la función arriba.

  ++a:     0.364700 millis
  a += 1:  0.346900 millis
  a++:     0.413700 millis

Probando la misma función en bucles for (for loops):

  ++a:     0.358370 millis
  a += 1:  0.351200 millis
  a++:     0.424600 millis

llOwnerSay v. llSay v. llShout v. llWhisper (Canal 0 donde corresponda):

  llOwnerSay(): 4.359000 millis
  llWhisper():  5.201000 millis
  llSay():      5.226000 millis
  llShout():   14.877000 millis

Diferentes Canales (llSay() Usado para todo):

  -100000000: 1.226400 millis
  -100000:    1.254300 millis
  -100:       1.296100 millis
  -1:         1.292400 millis
  0:          5.226000 millis
  1:          1.242300 millis
  100:        1.249100 millis
  100000:     1.219700 millis
  100000000:  1.228700 millis

Cantidad de texto (llSay() y Canal 1 usado para todo):

   1 Character:    1.242300 millis
   10 Characters:  1.309700 millis
   100 Characters: 1.965600 millis