How to optimize the speed of execution ?
Nasser
I've implemented a little state machine consisting of "if...elseif..." statements, in order to display the right image according to the checkboxes which the user checks.
At the moment, there are 2 checkboxes : "Remove baseline" and "Interpolate"
The time of execution for each of these processings separately (time1 and time2) is quite good, but if the two checkboxes are checked, then I have to wait longer (Total_time > time1 + time2)
Would you know any easy way to solve this little issue ?
Thanks in advance,
Best regards
//------------------------ BASELINE CORRECTION --------------------------------------------------
Function CheckProc_RemoveBaseline(ctrlName, ckRemoveBaseline) : CheckBoxControl //If a click occurs on the "Remove baseline" checkbox
String ctrlName
variable ckRemoveBaseline
SVAR STATE = root:STATE
If (ckRemoveBaseline)
if(cmpstr(STATE,"INTERP")==0) //if the image displayed is already interpolated
SetActiveSubWindow My_Panel#G0
Interpolate_Spectrum("ZSigPos","Interpolated_Spectrum")
RemoveBaseline("Interpolated_Spectrum","W_Smooth","Interp_LOESS_BLcorrected")
RemoveImage Interpolated_Spectrum
AppendImage /W=My_Panel#G0 /T Interp_LOESS_BLcorrected vs {VcStep,PosTimepic}
FormatGraph("My_Panel#G0","Interp_LOESS_BLcorrected","Geo",1)
STATE = "BLCOR_INTERP"
elseif (cmpstr(STATE,"RAW")==0) //if the image displayed is neither baseline-corrected, nor interpolated
SetActiveSubWindow My_Panel#G0
RemoveBaseline("ZSigPos", "W_Smooth", "ZsigPos_LOESS_BLcorrected")
RemoveImage ZSigPos
AppendImage /W=My_Panel#G0 /T ZsigPos_LOESS_BLcorrected vs {VcStep,PosTimepic}
FormatGraph("My_Panel#G0","ZsigPos_LOESS_BLcorrected","Geo",1)
STATE = "BLCOR"
endif
Else //if (ckRemoveBaseline==0) //if the user un-checks the "Remove baseline" option
if (cmpstr(STATE,"BLCOR_INTERP")==0) //the current image is both interpolated and baseline-corrected
SetActiveSubWindow My_Panel#G0
RemoveImage Interp_LOESS_BLcorrected
AppendImage /W=My_Panel#G0 /T Interpolated_Spectrum vs {VcStep,PosTimepic}
DisplayColorScale("Interpolated_Spectrum")
FormatGraph("My_Panel#G0","Interpolated_Spectrum","Rainbow",0)
STATE = "INTERP"
elseif(cmpstr(STATE,"BLCOR")==0) //the current image is only baseline-corrected
SetActiveSubWindow My_Panel#G0
RemoveImage ZsigPos_LOESS_BLcorrected
AppendImage /W=My_Panel#G0 /T ZSigPos vs {VcStep,PosTimepic}
DisplayColorScale("ZSigPos")
FormatGraph("My_Panel#G0","ZSigPos","Rainbow",0)
STATE = "RAW"
endif
Endif
End
//------------------------ INTERPOLATION --------------------------------------------------
Function CheckProc_Interpolate(ctrlName, ckInterpolate) : CheckBoxControl
String ctrlName
variable ckInterpolate
SVAR STATE = root:STATE
If (ckInterpolate)
if (cmpstr(STATE,"RAW")==0)
SetActiveSubWindow My_Panel#G0
Interpolate_Spectrum("ZSigPos","Interpolated_Spectrum")
RemoveImage ZSigPos
AppendImage /W=My_Panel#G0 /T Interpolated_Spectrum vs {VcStep,PosTimepic}
//Duplicate /O Interpolated_Spectrum, My_Pos_Spectrum
//KillWaves Interpolated_Spectrum
FormatGraph("My_Panel#G0","Interpolated_Spectrum","Rainbow",0)
STATE = "INTERP"
elseif(cmpstr(STATE,"BLCOR")==0)
SetActiveSubWindow My_Panel#G0
Interpolate_Spectrum("ZSigPos","Interpolated_Spectrum")
RemoveBaseline("Interpolated_Spectrum","W_Smooth","Interp_LOESS_BLcorrected")
RemoveImage ZsigPos_LOESS_BLcorrected
AppendImage /W=My_Panel#G0 /T Interp_LOESS_BLcorrected vs {VcStep,PosTimepic}
//Duplicate /O ZsigPos_LOESS_BLcorrected, My_Pos_Spectrum
//KillWaves LOESS_BLcorrected
FormatGraph("My_Panel#G0","Interp_LOESS_BLcorrected","Geo",1)
STATE = "BLCOR_INTERP"
endif
//
Else //if ckInterpolate==0
if (cmpstr(STATE,"BLCOR_INTERP")==0)
SetActiveSubWindow My_Panel#G0
RemoveImage Interp_LOESS_BLcorrected
AppendImage /W=My_Panel#G0 /T ZsigPos_LOESS_BLcorrected vs {VcStep,PosTimepic}
FormatGraph("My_Panel#G0","ZsigPos_LOESS_BLcorrected","Geo",1)
STATE = "BLCOR"
elseif(cmpstr(STATE,"INTERP")==0)
SetActiveSubWindow My_Panel#G0
RemoveImage Interpolated_Spectrum
AppendImage /W=My_Panel#G0 /T ZsigPos vs {VcStep,PosTimepic}
FormatGraph("Myg_Panel#G0","ZsigPos","Rainbow",0)
STATE = "RAW"
endif
Endif
End
Function CheckProc_RemoveBaseline(ctrlName, ckRemoveBaseline) : CheckBoxControl //If a click occurs on the "Remove baseline" checkbox
String ctrlName
variable ckRemoveBaseline
SVAR STATE = root:STATE
If (ckRemoveBaseline)
if(cmpstr(STATE,"INTERP")==0) //if the image displayed is already interpolated
SetActiveSubWindow My_Panel#G0
Interpolate_Spectrum("ZSigPos","Interpolated_Spectrum")
RemoveBaseline("Interpolated_Spectrum","W_Smooth","Interp_LOESS_BLcorrected")
RemoveImage Interpolated_Spectrum
AppendImage /W=My_Panel#G0 /T Interp_LOESS_BLcorrected vs {VcStep,PosTimepic}
FormatGraph("My_Panel#G0","Interp_LOESS_BLcorrected","Geo",1)
STATE = "BLCOR_INTERP"
elseif (cmpstr(STATE,"RAW")==0) //if the image displayed is neither baseline-corrected, nor interpolated
SetActiveSubWindow My_Panel#G0
RemoveBaseline("ZSigPos", "W_Smooth", "ZsigPos_LOESS_BLcorrected")
RemoveImage ZSigPos
AppendImage /W=My_Panel#G0 /T ZsigPos_LOESS_BLcorrected vs {VcStep,PosTimepic}
FormatGraph("My_Panel#G0","ZsigPos_LOESS_BLcorrected","Geo",1)
STATE = "BLCOR"
endif
Else //if (ckRemoveBaseline==0) //if the user un-checks the "Remove baseline" option
if (cmpstr(STATE,"BLCOR_INTERP")==0) //the current image is both interpolated and baseline-corrected
SetActiveSubWindow My_Panel#G0
RemoveImage Interp_LOESS_BLcorrected
AppendImage /W=My_Panel#G0 /T Interpolated_Spectrum vs {VcStep,PosTimepic}
DisplayColorScale("Interpolated_Spectrum")
FormatGraph("My_Panel#G0","Interpolated_Spectrum","Rainbow",0)
STATE = "INTERP"
elseif(cmpstr(STATE,"BLCOR")==0) //the current image is only baseline-corrected
SetActiveSubWindow My_Panel#G0
RemoveImage ZsigPos_LOESS_BLcorrected
AppendImage /W=My_Panel#G0 /T ZSigPos vs {VcStep,PosTimepic}
DisplayColorScale("ZSigPos")
FormatGraph("My_Panel#G0","ZSigPos","Rainbow",0)
STATE = "RAW"
endif
Endif
End
//------------------------ INTERPOLATION --------------------------------------------------
Function CheckProc_Interpolate(ctrlName, ckInterpolate) : CheckBoxControl
String ctrlName
variable ckInterpolate
SVAR STATE = root:STATE
If (ckInterpolate)
if (cmpstr(STATE,"RAW")==0)
SetActiveSubWindow My_Panel#G0
Interpolate_Spectrum("ZSigPos","Interpolated_Spectrum")
RemoveImage ZSigPos
AppendImage /W=My_Panel#G0 /T Interpolated_Spectrum vs {VcStep,PosTimepic}
//Duplicate /O Interpolated_Spectrum, My_Pos_Spectrum
//KillWaves Interpolated_Spectrum
FormatGraph("My_Panel#G0","Interpolated_Spectrum","Rainbow",0)
STATE = "INTERP"
elseif(cmpstr(STATE,"BLCOR")==0)
SetActiveSubWindow My_Panel#G0
Interpolate_Spectrum("ZSigPos","Interpolated_Spectrum")
RemoveBaseline("Interpolated_Spectrum","W_Smooth","Interp_LOESS_BLcorrected")
RemoveImage ZsigPos_LOESS_BLcorrected
AppendImage /W=My_Panel#G0 /T Interp_LOESS_BLcorrected vs {VcStep,PosTimepic}
//Duplicate /O ZsigPos_LOESS_BLcorrected, My_Pos_Spectrum
//KillWaves LOESS_BLcorrected
FormatGraph("My_Panel#G0","Interp_LOESS_BLcorrected","Geo",1)
STATE = "BLCOR_INTERP"
endif
//
Else //if ckInterpolate==0
if (cmpstr(STATE,"BLCOR_INTERP")==0)
SetActiveSubWindow My_Panel#G0
RemoveImage Interp_LOESS_BLcorrected
AppendImage /W=My_Panel#G0 /T ZsigPos_LOESS_BLcorrected vs {VcStep,PosTimepic}
FormatGraph("My_Panel#G0","ZsigPos_LOESS_BLcorrected","Geo",1)
STATE = "BLCOR"
elseif(cmpstr(STATE,"INTERP")==0)
SetActiveSubWindow My_Panel#G0
RemoveImage Interpolated_Spectrum
AppendImage /W=My_Panel#G0 /T ZsigPos vs {VcStep,PosTimepic}
FormatGraph("Myg_Panel#G0","ZsigPos","Rainbow",0)
STATE = "RAW"
endif
Endif
End
First, I'm a bit confused what "two checkboxes are checked" means exactly. This doesn't mean to hit two check boxes at the same time, right? Do you mean the time lag when pressing the second checkbox while the first one is still processing?
But for now I would go like this: Ok, I don't now if this suits your taste in programming style, but I would merge these two functions into one for both checkboxes and then move redundant operations to key spots to minimize the function size. Especially
SetActiveSubWindow My_Panel#G0
is called every time. And I don't know how all this works exactly, but just by glazing at it, I think 8 processing branches for a 4 choice matrix seems a bit much to me. For me it's always too confusing to spot optimizations in huge functions, so I try to shrink processes as much as possible and isolate bottlenecks. It's also easier for me to spot little pesky errors this way (in the pasted code is a "Myg_Panel#G0" at the bottom, but I assume that's not written this way in your procedure).Best Regards
January 27, 2011 at 10:42 am - Permalink
Thank you for your answer
"two checkboxes are checked" means "One of the 2 checkboxes is checked, then the user checks the other one".
Yes, I know. I'll do it.
But I don't understand why the time of execution of one function followed by another one is much greater than the sum of the separate times (timeTotal_time > t1 + t2)
Best Regards
January 28, 2011 at 12:35 am - Permalink
Perhaps you forgot a break statement so both are executing instead of one of them.
Try executing it from the command line.
Try setting a breakpoint in the control action procedure.
Try printing out the execution time. For example:
. . . do something here . . .
Variable elapsedSeconds = StopMSTimer(timer) / 1E6
Print elapsedSeconds
January 28, 2011 at 03:36 am - Permalink
That's what I wish : executing one function (Interpolate), immediately followed by another one (Remove baseline). It takes 38 s to perform these two functions.
I'm still looking at this. I'll post an answer if I find something.
Thank you.
Best Regards
January 28, 2011 at 06:33 am - Permalink
Interpolating, then Correcting the baseline takes 38 seconds because the image is bigger, because of the interpolation.
So, it's sufficient to correct the baseline, then interpolate the image.
January 28, 2011 at 09:07 am - Permalink