Hi David,

Could you break out the creation of the Pen and Brush onto separate lines to see
what percentage of the time the object creation or the SetPen / SetBrush are
taking up. If the object creation is the problem you could pre-create an array
of pen and brushes that would be indexed by color.

Regards,
Krys

Quoting David Carr <[EMAIL PROTECTED]>:
> I've spent some time profiling the waterfallsink code.  Currently its 
> pretty abominably slow.  I'm using python's profile module to do the 
> following.
> 
> For a given run:
> 
> total run time on cpu as reported by the command "time"
> real    0m17.874s
> user    0m16.364s
> sys     0m0.883s
> 
> python profile module reported total run time:
> 8.06 sec (8.06 is 45% of 17.87)
> 
> Where does the rest of the time go?
> 
> Here's the 8.06 sec broken down:
> 
> set_data() 92%
>     set_data_loop() 86%
>         dc1.SetPen(dc1.SetPen(wx.Pen(colour, 1, wx.SOLID)) 51%
>         dc1.SetBrush(wx.Brush(colour, wx.SOLID)) 28%
>         dc1.DrawRectangle(x_pos*p_width, 0, p_width, 1) 7% 
> 
> The offending code (broken into parts for profiling)
> 
> def set_data_loop_draw(self, dc1, x_pos, p_width, value):
>         colour = wx.Colour(value, value, value)
>         dc1.SetPen(wx.Pen(colour, 1, wx.SOLID))
>         dc1.SetBrush(wx.Brush(colour, wx.SOLID))
>         dc1.DrawRectangle(x_pos*p_width, 0, p_width, 1)
> 
>     def set_data_loop(self, dc1, dB, d_max, p_width):
>         for x_pos in range(0, d_max):
>                 value = int(dB[x_pos] * 1.5)
>                 if value > 255:
>                     value = 255
>                 elif value < 0:
>                     value = 0
>                 self.set_data_loop_draw(dc1, x_pos, p_width, value)
>                
> 
>     def set_data (self, evt):
>         data = evt.data
>         dB = 20 * Numeric.log10 (abs(data) + 1e-8)
>         l = len (dB)
>        
>         dc1 = wx.MemoryDC()
>         dc1.SelectObject(self.bm)
>         dc1.Blit(0,1,self.info.fft_size,300,dc1,0,0,wx.COPY,False,-1,-1)
> 
>         if self.info.input_is_real:
>             d_max = l/2
>             p_width = 2
>         else:
>             d_max = l
>             p_width = 1
> 
>             self.set_data_loop(dc1, dB, d_max, p_width)
>       
>         self.DoDrawing (None)
> 
> Where do we go from here?  I should note that the loop is not actually 
> that slow, its just gets iterates for every drawn pixel.  That 
> translates to 18,432 calls to the loop itself in 8.06 seconds at 512 
> iterations per call.  Ideally this loop could be eliminated if there 
> were a way to plot a vector rather than each point individually.  That 
> would be very nice indeed.
> 
> It would also be nice to know where the other 17 - 8.06 = ~9 seconds go 
> that profiling doesn't account for...
> 
> -David Carr
> 
> 
> _______________________________________________
> Discuss-gnuradio mailing list
> [email protected]
> http://lists.gnu.org/mailman/listinfo/discuss-gnuradio
> 




_______________________________________________
Discuss-gnuradio mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to