필터 지우기
필터 지우기

How Can I Speed Up My Code

조회 수: 5 (최근 30일)
Brian
Brian 2012년 10월 10일
I've got a job that is running a bunch of iterations on a large dataset and taking more time than I'd like. While I'd like to write the job to use ParFor that's too much work at the moment because of how things are written currently. I'm hoping to make a few quick tweaks to speed up the code. When I run the profiler I see 3 self made Calls that are taking up 80% of the run time. Two of the calls are slow because of appending to unallocated variables, which I will fix but the slowest of the 3 is below. I am just wondering if this call can be made more effient.
40% of project total Run Time CurSL = SPReturns_Trl(:,i) - SP_TR_Trl(i) < SL_Amount(sla);
Where SPReturns_Trl = 9813x5742 Double and SP_TR_Trl = 1x5742 Double.
SL_Amount is just a 1x6 Double.
Thanks a lot, Brian

채택된 답변

Matt J
Matt J 2012년 10월 10일
Instead of looping over i, perhaps vectorize using BSXFUN
CurSLTotal=bsxfun(@lt,SPReturns, SP_TR_Trl + SL_Amount(sla));
  댓글 수: 2
Brian
Brian 2012년 10월 11일
I ended up with the following 3 lines of code that are much faster in aggregate that the old for loop.
Doing the subtraction and less than in aggregate rather than one column at a time.
Differences = bsxfun(@minus,SPReturns_Trl,SP_TR_Trl);
Differences = bsxfun(@lt,Differences,SL_Amount(sla));
Inside the for loop (for each day) I choose the proper logical index value from the Differences index created above.
CurSL = Differences(:,i);
Matt J
Matt J 2012년 10월 11일
Okay, though, it's not entirely clear to me why this required 2 calls to bsxfun, rather than the single call I proposed.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Jan
Jan 2012년 10월 10일
편집: Jan 2012년 10월 10일
Do not forget, that the profiler disables the JIT acceleration. Therefore the measurements can have a strong bias. Some TIC/TOCs are smarter.
CurSL = SPReturns_Trl(:,i) - SP_TR_Trl(i) < SL_Amount(sla)
Matlab computes statements from left to right:
tmp1 = SPReturns_Trl(:,i) - SP_TR_Trl(i); % vector operation
CurSL = tmp1 < SL_Amount(sla); % vector operation
When I assume, that "i" and "sla" are scalar counters (please explain the necessary details...), one vector operation can be omitted:
CurSL = SPReturns_Trl(:,i) < (SL_Amount(sla) + SP_TR_Trl(i));
Now we get:
tmp1 = (SL_Amount(sla) + SP_TR_Trl(i)); % Scalar
CurSL = SPReturns_Trl(:,i) < tmp1; % Vector
However, optimizing a single line taken out of its context is not reliable. If the missing pre-allocation causes disk swapping, it can happen, that a lot of time is spent during the shown command is processed, but not because of the command.
So fix the severe pre-allocation problems at first to avoid the famous anti-pattern of pre-mature optimization.
  댓글 수: 1
Brian
Brian 2012년 10월 10일
편집: Brian 2012년 10월 11일
tic and toc would be nice, but the reason this specific loop is slow is that I'm running it 5742*630 times or 3.6 million times. I guess in this case tic and toc may not help me much.
Both of your suggestions may help me. I will have more time to address first thing tomorrow when I'm back in the office. Jan, the second part of your answer is around 2-4 feet over my head. I am an Investments person, not a programmer by trade. That's not to say that I don't wish I understood what that meant, but currently I do not.
Thanks for the help guys.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by