Al crear una biblioteca de funciones personalizadas, noté una marcada diferencia en el rendimiento del mismo código de función dependiendo de si la función está en el espacio de nombres global o en un espacio de nombres definido por el usuario. En al menos un caso frustrante mío, la misma función tarda 7 veces más en ejecutarse cuando está en un espacio de nombres personalizado, en comparación con el espacio de nombres global.
La diferencia no importa en muchas aplicaciones, pero estoy usando estas funciones en tablas con filas de 500K a 5M; una diferencia de esta magnitud marca la diferencia entre una función que está bien y una que no se puede usar.
Aquí algunos JSL que ejemplifican la diferencia:
Names Default to Here(1);
Add Custom Functions(
globaltest = New Custom Function(
"Global",
"test123",
Function({x, y, z},
{a, b, c},
a = x;
b = y;
c = z;
Return(c)
)
)
);
Add Custom Functions(
nstest = New Custom Function(
"other",
"test123",
Function({x, y, z},
{a, b, c},
a = x;
b = y;
c = z;
Return(c)
)
)
);
For(i = 1, i <= 10000, i++,
foo = ::test123(i, i, i);
);
For(i = 1, i <= 10000, i++,
foo = other:test123(i, i, i);
);En mi máquina, :: test123 () se ejecuta en 143 ms, mientras que otro: test123 tarda 343 ms.
Tengo algunas funciones que idealmente me gustaría implementar en un espacio de nombres personalizado o como métodos de clase, pero la sobrecarga asociada con la calificación del espacio de nombres lo hace insostenible.
¿Han notado otros esto, y existen técnicas / consideraciones que pueden acelerar la invocación de funciones calificadas para espacios de nombres?
Vaya, buscando en la guía de secuencias de comandos p 896 encontré algunos comentarios sobre esto. Debería haber sabido mirar allí primero. El mayor consejo parece ser favorecer las expresiones sobre las funciones si la velocidad es crítica. Además, no me di cuenta de que las declaraciones Return () ralentizaron las cosas. Cualquier otro consejo sería agradecido.
return (), break () y continue () tienen el mismo comportamiento. Si bien hacen que JSL sea más fácil de leer y mantener, hay algo de sobrecarga cuando se ejecutan. Estoy bastante seguro de que el generador de perfiles JSL los señalará si son el punto caliente.
Sí, he notado que también hay una penalización por los espacios de nombres, pero estoy dispuesto a usarlos para proyectos complicados. Para las variables simples que demuestran ser el punto caliente, puede usar una estrategia de copia y copia como se muestra a continuación. (Perfil primero, ¡no optimices el código que no te está ralentizando!)
Lo siguiente no hace casi nada más que ejercitar el espacio de nombres; la mayoría del código no vería tanta penalización por usar un espacio de nombres. @EvanMcCorkle
test = New Namespace(
"test"
);
f = Function( {},
{i, testx},
test:x = 0;
If( useLocal, // speed up by copy-in, copy-out
testx = test:x;
For( i = 1, i < 1e6, i += 1,
testx = testx + 1
);
test:x = testx;
, // no speed up
For( i = 1, i < 1e6, i += 1,
test:x = test:x + 1
);
);
);
useLocal = 0;
t0 = Tick Seconds();
f();
t1 = Tick Seconds();
Show( useLocal, t1 - t0, test:x );//t1 - t0 = 2.76666666666642;
useLocal = 1;
t0 = Tick Seconds();
f();
t1 = Tick Seconds();
Show( useLocal, t1 - t0, test:x );//t1 - t0 = 0.316666666665697;¡Voy a probar la estrategia de entrada y salida! Gracias Craige !!!!