예스스탁
예스스탁 답변
2021-02-02 13:24:00
안녕하세요
예스스탁입니다.
수식이 전체 문장을 스캔하는 체계라 함수식 계산을 막을 방법은 없습니다.
if a1 > 0 Then
{
f1 = fct1(~~~~);
g1 = 계산식;
}
Else
{
f1 = 0;
g1 = 0;
}
위와 같이 처리해도 크게 차이는 없습니다.
수식의 계산속도나 부하를 줄이시려면
전체수식에서 함수 포함해서 동일 계산을 한번만 하게 하셔야 합니다.
fct1~10의 함수내용은 알수 없으므로 만약 아래와 같은 시스템이 지표식이 있다면
Input : Period(20), MultiD(2);
var : BBmd(0),BBup(0),BBdn(0);
BBmd = ma(C,Period); #1
BBup = BollBandUp(Period,MultiD);#2
BBdn = BollBandDown(Period,MultiD);#3
Plot1(BBup, "상단");
Plot2(BBdn, "하단");
실제 10줄도 안되는 수식이지만 내부적으로 위 지표식은
이동평균은 5번, 표준편차가 2번 계산됩니다.
#1계산을 위해 이평계산1번,
#2계산을 위해 이평계산1번,표준편차1번(표준편차에 이평계산 1번추가)
#3계산을 위해 이평계산1번,표준편차1번(표준편차에 이평계산 1번추가)
함수를 이용해 작성하면 간단하지만 실제 부하를 줄이기 위해서는
아래와 같이 작성하면 이평계산은 2번,표준편차 1번이 됩니다.
Input : Period(20), MultiD(2);
var : BBmd(0),stdv(0),BBup(0),BBdn(0);
BBmd = ma(C,Period);
stdv = std(C,Period);
Bbup = bbmd+stdv*MultiD;
BBdn = bbmd-stdv*MultiD;
Plot1(BBup, "상단");
Plot2(BBdn, "하단");
다시 표준편차도 아래와 같이 풀어쓰면
이평1번, 표준편차 1번으로 계산횟수가 작아지게 됩니다.
Input : Period(20), MultiD(2);
var : BBmd(0),SumSqrt(0),stdv(0),BBup(0),BBdn(0),cnt(0);
BBmd = ma(C,Period);
SumSqrt = 0;
For cnt = 0 To Period- 1
{
SumSqrt = SumSqrt + (C[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / Period);
Bbup = bbmd+stdv*MultiD;
BBdn = bbmd-stdv*MultiD;
Plot1(BBup, "상단");
Plot2(BBdn, "하단");
즉 이평을 한번만 계산해서 변수에 저장하고 필요한 곳에 사용하게 해서 불필요한 동일계산의 횟수를 줄이는 것입니다.
사용자함수를 사용하는 것도 실제 수식에서 해당 함수식 내용을 나열해 작성하는 것과 같습니다.
각 함수 내용안에 동일한 계산이 있다면 위와 같이 풀어서 한번 계산으로
필요한 곳에 변수만 가져가서 사용하게 만드셔야 부하를 줄이실수 있습니다.
해당 방법이 아니면 별도로 줄일방법이 마땅히 없습니다.
즐거운 하루되세요
> 에구머니 님이 쓴 글입니다.
> 제목 : 수식 문의
> 안녕하세요?
Fct1(g1, ...), ... Fct10(g10, ...) 이라는 꽤 복잡한 함수들이 있습니다.
게다가 Fct1 에는 g1 이라는 꽤 복잡한 녀석을 인수로 갖고, ...
Fct10은 g10 이라는 꽤 복잡한 녀석을 인수로 갖습니다.
input: a1(0), ... a10(0) // a1 ~ a10은 0 또는 자연수
var: sum(0);
g1 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡.
g2 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡.
...
g10 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡.
sum = a1*Fct1 + ... + a10*Fct10;
을 계산하고 싶은데,
시스템의 부하를 줄이기 위해서 a1, ... a10 중 0이 아닌 경우에만 해당 Fct을 계산하고 싶습니다.
그러니까 a1 == 0 이면 g1 계산도 건너뛰고, Fct1 도 계산안하고 넘어가고 (말하자면 그냥 0 대입...)
a3 > 0 면 그 때에는 g3도 계산하고, Fct3도 계산하고, ...
뭐 이런 식으로 시스템 부하를 줄이고 싶습니다.
좋은 방법이 있겠습니까?
또 그러면 정말로 시스템 부하가 g1, Fct1 계산을 생략하는 것만큼 줄까요?
혹시, var1 ~ var99, value1 ~ value99 의 초기값이 0이란 것을 이용해서
계산량이나 시스템 부하를 줄일 수 있다면 이런 것들도 적극적으로 같이 사용해 주시기 바랍니다.
그러니까, 목표는 수단 방법을 안 가리고, 시스템 부하를 줄이는 것입니다.
위의 함수들 Fct1, ... Fct10이 내부에 또 함수들을 사용하는 등, 꽤나 복잡해서요,
몇 개라도 줄일 수 있다면 안정성 등에서 참 좋겠습니다.
감사합니다.