Lors de la création d'une bibliothèque de fonctions personnalisées, j'ai remarqué une différence marquée dans les performances du même code de fonction selon que la fonction se trouve dans l'espace de noms global ou dans un espace de noms défini par l'utilisateur. Dans au moins un de mes cas frustrants, la même fonction prend 7 fois plus de temps à s'exécuter lorsqu'elle se trouve dans un espace de noms personnalisé, par rapport à l'espace de noms global.
La différence n'a pas d'importance dans de nombreuses applications, mais j'utilise ces fonctions sur des tables avec des lignes de 500K à 5M ; une différence de cette ampleur fait la différence entre une fonction qui fonctionne bien et une autre qui est inutilisable.
Voici quelques JSL qui illustrent la différence :
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);
);Sur ma machine, ::test123() s'exécute en 143 ms, alors que other:test123 prend 343 ms.
J'ai quelques fonctions que j'aimerais idéalement implémenter dans un espace de noms personnalisé ou en tant que méthodes de classe, mais la surcharge associée à la qualification d'espace de noms rend cela intenable.
D'autres ont-ils remarqué cela, et existe-t-il des techniques/considérations qui peuvent accélérer l'invocation de fonctions qualifiées d'espace de noms ?
Je vais essayer la stratégie in-out !!! Merci Craig !!!!
return(), break() et continue() ont tous le même comportement. Bien qu'ils facilitent la lecture et la maintenance du JSL, il y a une surcharge lors de leur exécution. Je suis presque sûr que le profileur JSL les signalera s'ils sont le point chaud.
Oui, j'ai remarqué qu'il y a aussi une pénalité pour les espaces de noms, mais je suis prêt à les utiliser pour des projets compliqués. Pour les variables simples qui s'avèrent être le point chaud, vous pouvez utiliser une stratégie de copie, de copie comme ci-dessous. (Le profil d'abord, n'optimisez pas le code qui ne vous ralentit pas !)
Ce qui suit ne fait presque rien d'autre qu'exercer l'espace de noms ; la plupart des codes ne verraient pas cette pénalité pour l'utilisation d'un espace de noms.@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;Oups, en regardant dans le guide de script p 896, j'ai trouvé quelques remarques à ce sujet. J'aurais dû savoir qu'il fallait y regarder en premier. Le plus gros conseil semble être de privilégier les expressions aux fonctions si la vitesse est critique. De plus, je n'avais pas réalisé que les instructions Return() ralentissaient les choses. Tous les autres conseils seraient les bienvenus.