在創建自定義函數庫時,我注意到相同函數代碼的性能存在顯著差異,具體取決於該函數是在全局命名空間中還是在用戶定義的命名空間中。 至少在我的一個令人沮喪的案例中,與全局命名空間相比,同一函數在自定義命名空間中的執行時間是其執行時間的 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() 語句會減慢速度。 任何其他提示將不勝感激。