在创建自定义函数库时,我注意到相同函数代码的性能存在显着差异,具体取决于该函数是在全局命名空间中还是在用户定义的命名空间中。 至少在我的一个令人沮丧的案例中,与全局命名空间相比,同一函数在自定义命名空间中的执行时间是其执行时间的 7 倍。
在许多应用程序中,差异并不重要,但我在具有 500K 到 5M 行的表上使用这些函数;这种量级的差异会导致功能良好与不可用之间的差异。
这里有一些 JSL 举例说明了差异:
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);
);在我的机器上,::test123() 执行时间为 143 毫秒,而 other:test123 执行时间为 343 毫秒。
我有一些理想情况下希望在自定义命名空间中或作为类方法实现的函数,但是与命名空间限定相关的开销使这变得站不住脚。
其他人是否已经注意到这一点,是否有可以加快名称空间限定函数调用的技术/注意事项?
return()、break() 和 continue() 都具有相同的行为。 虽然它们使 JSL 更易于阅读和维护,但在执行它们时会产生一些开销。 我很确定 JSL 探查器会指出它们是否是热点。
是的,我注意到命名空间也会受到影响,但我愿意将它们用于复杂的项目。 对于被证明是热点的简单变量,您可以使用如下所示的复制输入、复制输出策略。 (首先分析,不要优化不会减慢你速度的代码!)
以下内容几乎只执行名称空间;大多数代码不会因为使用命名空间而受到如此多的惩罚。@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;糟糕,查看脚本指南第 896 页我发现了一些关于此的评论。 我早该知道先去那里看看。 如果速度很关键,最大的建议似乎是支持表达式而不是函数。 另外,我没有意识到 Return() 语句会减慢速度。 任何其他提示将不胜感激。