程式效能問題

  •   274 
  • 最後發表   吾夜遊冥  2022 五月 19
吾夜遊冥 發文於   2022/05/11

以下面程式碼為例

///

 

value1 = getField("close","D")[1];

value2 = value1 /getField("close","D")[2];

 

if condition1 and condition2 and condition3  then begin ...

///

 

抱歉我外行,想請問:

1. xs 的設計會把 getField("close","D")[1]的值 assign 給變數value1 嗎?在這個例子中,總共call了2次還是3次?

2. 若是assign 給變數value1, 請問cache的時間是單次tick的程式執行時間嗎,因為我逐筆洗價的程式碼中,若每tick都重複呼叫相同的昨日資訊,似乎有點浪費效能

3. 在三個condition 條件交集中,若condition1 為 False, 程式是否會繼續執行condition2與condition3?

4. 會有以上問題是因為我的策略多了幾個簡單條件後,回測速度呈倍數增長,動輒數十分鐘,不清楚是哪個環節出問題,是程式碼的時間複雜度爆炸 or IO過慢,可否能像Leetcode那樣知道程式的運算效率?

排序方式: 標準 | 最新
XQ小幫手 發文於   2022/05/13

Hello 吾夜遊冥,

 

1.是呼叫2次。

 

2.不是單次運算,而是腳本持續執行時該變數都會保留最後一次被計算的值。

 

3.不會繼續執行。

 

4.對於腳本優化有興趣的話,小幫手建議您可以從演算法開始學起。

至於關於知道程式運算效能的部分,小幫手會將您的建議轉告相關人員。

吾夜遊冥 發文於   2022/05/13

2.請問有辦法做到在日頻率以下的策略,對於日資料每天只call一次嗎?

4.效能問題未必出在算法,例如我有遇過執行時間異常長的案例是spark oom,運算中繼點將資料寫入硬碟,從而導致執行時間都花費在IO,spark UI 會顯示每個運算節點花費的時間等資訊幫助我們找到問題點。

現在情況是我只知道回測時間非常長,且每次都不同,我無法得知內建函數寫法or貴公司雲端or地端的配置等資訊,要在這種情況下找出問題並優化似乎很難。

當然我也知道XS是比較for大眾化的產品,必須以大多數人需求為主,但回測時間過長真的挺困擾。

GaryChiang 發文於   2022/05/13

if date<>date[1] then begin
  ...
  ...
  ...
end;

  • 按讚來自於
  • sb04870487
吾夜遊冥 發文於   2022/05/13

感謝 GaryChiang

XQ小幫手 發文於   2022/05/16

Hello 吾夜遊冥,

 

就小幫手所知,回測所使用的資料都是讀取到記憶體以便快速存取。

另外回測是執行在伺服器這邊,所以您電腦的規格應該是不會有影響的。

伺服器忙碌時可能就會造成回測運算時間較長的狀況。

內建函數的寫法您可以打開XS編輯器,裡面大部分的函數都看的到。

根據過往的經驗,回測時使用逐筆洗價,腳本內有使用迴圈都會容易造成回測時間拉長的狀況。

建議您可以避免上述的點,如果有需要使用的話,可以考慮縮短每次回測的區間。

 

感謝 GaryChiang 的熱心回覆。

貓老大 發文於   2022/05/17

if date<>date[1] then begin
  ...
  ...
  ...
end;

這個是邏輯上的解法沒錯, 但效能上其實沒改善, 因為每次執行都要進行 if 的判斷. 甚至要連取兩個date/date[1]的值

效能上要解決這個問題, 必須XQ在結構上能提供 初始化 的程式段, 類似 建構子 或是 Win_Init() 之類的概念

 

  • 按讚來自於
  • sb04870487
XQ小幫手 發文於   2022/05/19

Hello 吾夜遊冥,

 

小幫手補充,如果您修改過腳本,還是會發生回測過久的狀況,可以提供腳本以及回測的設定,小幫手這邊研究看是否有辦法能優化。

 

發表回覆
Close