Code::Blocks

Developer forums (C::B DEVELOPMENT STRICTLY!) => Plugins development => Topic started by: grv575 on January 04, 2006, 06:46:30 am

Title: debugger speed
Post by: grv575 on January 04, 2006, 06:46:30 am
Could the debugger speed of CB be improved?  Other ide's which rely on gdb as a backend seem to fare much better in terms of the time it takes from the moment you hit the step button to the time the arrow updates.  For example

http://www.codecutter.net/tools/quincy/

is really fast.  You can hit the step button over and over and it updates without unnerving slowness.  One of the differences is that it seems to use a less verbose gdb mode which might account for some of the sluggishness of the CB debugger, although I'd wager that profiling the gdb/debugger handling code would also have a great impact.

So, is this an area that can be improved, as it's a shame that it's so slow compared to other gdb backend ides (which are much less polished).
Title: Re: debugger speed
Post by: rickg22 on January 04, 2006, 05:26:18 pm
grv: Depends. Tell me if  there's any array scan in the debugger plugin, and i'll take out my STL (http://www.cppreference.com/cppstl.html) swiss-army-knife in no time! :P
(After i finish revamping Codecompletion that is...  :mrgreen: )
Title: Re: debugger speed
Post by: thomas on January 04, 2006, 05:34:15 pm
Sometimes I regret the day when I said "Hey, why don't you use STL containers"  :lol: :lol: :lol:
Title: Re: debugger speed
Post by: mandrav on January 04, 2006, 05:49:15 pm
Oh no! Please Rick, no! :lol:
I 'm still working on this plugin.
Title: Re: debugger speed
Post by: Ceniza on January 04, 2006, 05:55:36 pm
C'mon thomas, you just showed Rick the light, it's not your fault if he goes blind :)

No need to reply to this message.
Title: Re: debugger speed
Post by: rickg22 on January 04, 2006, 06:46:32 pm
AH HAH! I KNEW IT! MUAHAHAHA It's the parsing of the ouptut!  8)

Look at this: (RC2, i'm at work :mrgreen: )

Code: [Select]
for (unsigned int i = 0; i < lines.GetCount(); ++i)
{
...
if (lines[i].StartsWith( ...
else if (lines[i].StartsWith( ...
else if (lines[i].StartsWith( ...
...
else if (lines[i].StartsWith(g_EscapeChars)) // ->->
            wxRegEx reSource;
  reSource.Compile(...
}
There's a regex compilation inside a tight for-loop (I agree, it's conditional, but nevertheless it'll be done once per output-parsing). If you make it a member and init it on the constructor, it'll run much faster :)

Edit: You can also get rid of the
Code: [Select]
wxArrayString lines = GetArrayFromString(buffer, _T('\n'));
by scanning for newlines manually and extracting the string one at a time. This spares us a lot of memory allocation.

Edit again: Of course, if this code was optimized previously on SVN, scratch all that :P
Title: Re: debugger speed
Post by: mandrav on January 04, 2006, 07:00:27 pm
There's a regex compilation inside a tight for-loop (I agree, it's conditional, but nevertheless it'll be done once per output-parsing). If you make it a member and init it on the constructor, it'll run much faster :)

I know Rick :)
I said I 'm still working on it. But don't expect this to speed things up because most of those conditionals happen once or twice a second (approximately).

Since we 're on the subject:

grv575 you can't possibly compare the speed of C::B's debugger with Quincy's... You 're comparing apples with oranges here ;)
C::B will display a whole slew of information in every debugging step. Granted, this will take some longer but not that much. Actually the only time I saw it slow down was when I was watching a '*this' which had a whole *lot* of members (STL, etc). If you take a look at the debugger's debug log, you will see what kind of information it parses in each debugging step.
And working with gdb using annotations (--annotate) won't make it run faster (we used to use this approach). It's just that there is too much information to update...
On the other hand, when debugging MSVC executables with CDB, it's not that slow. You know why? Because CDB doesn't expand nested types so less info comes in...

Just a few pointers.
Suggestions are always welcome of course :)
Title: Re: debugger speed
Post by: rickg22 on January 04, 2006, 07:17:13 pm
Yiannis: I'm having a Deja Vu. While doing the codecompletion optimization i noticed that i could (haven't done it yet, but will) build a tree structure using maps (inside the parserthread), to mimic the structure used inside the wxTreeCtrl. Using STL maps will make the items get sorted automatically. Finally, I'll trigger an event to update the tree (no need for sorting now) using the temporary structure.

My question is: Why not do it the same way for the debugger? Using a "debuggerthread" (TM) to build the debug tree? This will also give us an advantage: If at any point you're not finished building the tree, and the user press shift-f7 again, you can just clear the temporary tree structure, and abort the rendering, for when the user finally stops.

The trick is having a container (not STL container, just a container object) to hold all the debugger-related structure. Everytime you access the container, you enter a critical section, and voila :)

Edit: No need to have this done by tomorrow, just finish polishing the new UI and notebook :)
Title: Re: debugger speed
Post by: thomas on January 04, 2006, 07:24:51 pm
Everytime you access the container, you enter a critical section, and voila :)
You realize that entering and leaving a critical section is on the order of 103 slower than allocating a wxArrayString and parsing a buffer?
Title: Re: debugger speed
Post by: rickg22 on January 04, 2006, 07:25:44 pm
oops :P
Title: Re: debugger speed
Post by: Ceniza on January 04, 2006, 07:34:56 pm
Rick: Advice from a book (not textually): "Many times having a structure that sorts its elements in every insertion (like set and map) is slower than just inserting all the elements and sorting them at the end (in a vector, deque or list)."

I haven't tried it myself, but I'll maybe do :)

Also remember there're algorithms to search an element in a sorted range.

You've been a bit paranoiac about optimizations (that's good too) so I'm just throwing some more wood to the fire :P
Title: Re: debugger speed
Post by: mandrav on January 04, 2006, 07:41:37 pm
Yiannis: I'm having a Deja Vu. While doing the codecompletion optimization i noticed that i could (haven't done it yet, but will) build a tree structure using maps (inside the parserthread), to mimic the structure used inside the wxTreeCtrl. Using STL maps will make the items get sorted automatically. Finally, I'll trigger an event to update the tree (no need for sorting now) using the temporary structure.
<snip>

Here we go again :)
Rick, you 're forgetting one thing: communication with the debugger is done by piping input-output channels. This is inherently slow, when compared with directly calling code and receiving results (like codecompletion).
*And* you can't stop the debugger once you 've given it a command. You *must* wait to get all its output...
Title: Re: debugger speed
Post by: thomas on January 04, 2006, 07:52:52 pm
Omg... I have to change my signature... :lol:
Title: Re: debugger speed
Post by: rickg22 on January 04, 2006, 08:33:46 pm
Yiannis: OK! :) I'll shut up now.
(I was just trying to help...  :oops: )
Title: Re: debugger speed
Post by: Michael on January 04, 2006, 08:53:57 pm
Rick: Advice from a book (not textually): "Many times having a structure that sorts its elements in every insertion (like set and map) is slower than just inserting all the elements and sorting them at the end (in a vector, deque or list)."

IMHO, it depends on your application. Insertion is slower in a map, but faster in a vector. Find is slower in a vector, but faster in a map. All this remember me database's indexes :). Do a lot of insert into a map is time consuming and I think as Ceniza's book that in a such a case, it would be better to insert the elements at end of the container and sorting them later. Anyway, sorting algorithms are slow (especially with a lot of elements).

Personally, I find this website on STL (http://www.sgi.com/tech/stl/stl_index.html) useful :).

Michael

PS.: Optimization is a highly discussed topic. Useful? Not useful? When? IMHO an "intelligent" optimization is ok (especially if done at the end).
 
Title: Re: debugger speed
Post by: Ceniza on January 04, 2006, 09:07:12 pm
Heh, that "website on STL" is the site of the STL implementation used by GCC :)
Title: Re: debugger speed
Post by: Michael on January 04, 2006, 09:16:03 pm
Heh, that "website on STL" is the site of the STL implementation used by GCC :)
To be honest, I was not aware of this :oops:. Anyway, I find it really helpful (especially when I was implementing a PriorityQueue (wrapper to a multimap) :)) with a lot of term definitions, examples, information and so on.

Michael
Title: Re: debugger speed
Post by: Ceniza on January 04, 2006, 09:19:53 pm
PriorityQueue... std::priority_queue<> didn't suit your needs? :)
Title: Re: debugger speed
Post by: Michael on January 04, 2006, 09:37:57 pm
PriorityQueue... std::priority_queue<> didn't suit your needs? :)
Unfortunately not :D. It was an exam for an advanced course in C++ meta-programming and distribute programming (one of the best course I have ever had, to be honest). The std::priority_queue<> did not fullfil the requirements (it would have been too easy :D). If I remember, indexes of the PriorityQueue were not unique. Therefore, I needed a multimap (with some modifications to fit the requirements). What it was very interesting and not so known was the problem related with elements of a same index :). Their order in the multimap is not fixed. SO, how e.g., would it possible to delete the older element if more than one element has the same index?

Michael
Title: Re: debugger speed
Post by: Game_Ender on January 04, 2006, 11:15:34 pm
It is kind of useless for people talk about what they might think the bottlenecks in the code are and there solutions.  Someone should go and profile the debugger so we know where most of the actual time in the debugger is being spent.  Then we can start to talk about whether or not to use threads, or wxStringArrays, or Maps vs Vectors.  Or it might be that most of the time is just spent piping the stdin and stdout and there is nothing really to be done in speeding it up, but oops, there I go speculating.
Title: Re: debugger speed
Post by: rickg22 on January 04, 2006, 11:24:30 pm
Good idea :)
Sorry for my over-enthusiastic attitude (see my sig.)
Title: Re: debugger speed
Post by: grv575 on January 04, 2006, 11:39:27 pm
grv575 you can't possibly compare the speed of C::B's debugger with Quincy's... You 're comparing apples with oranges here ;)

Well I'm an optimization freak  :D

But quincy does do watch variables as well and still has instant reponsiveness.  It may have to do with the fact that I'm running a 1.1 ghz centrino as well (tablet - why it's so slow), but the delay is bad enough that you're more inclined to use breakpoints and continue than stepping through 5-10 lines in a function.  Is the gdb verbose mode needed then, or what's it used for over the standard output gdb gives?

I remember the only thing quincy does is:
info f(rame)
every line.  Not sure exactly what for though - maybe to track which thread it is in or something.

IIRC gprof was a no go on the CB source.  Maybe I'll see if there's any good free assembly level call profilers that might be able to zero in on what's taking the most time on this machine.
Title: Re: debugger speed
Post by: Der Meister on January 04, 2006, 11:52:00 pm
IIRC gprof was a no go on the CB source.  Maybe I'll see if there's any good free assembly level call profilers that might be able to zero in on what's taking the most time on this machine.
Compuware's DevPartner Profiler Community Edition is a free and imho really good and powerfull profiler. However, it is a plugin for Visual Studio and I don't know if it is possible to get Code::Blocks compiled with MS Visual Studio and this profiler. But maybe I'll give it a try if I find some free time.
Title: Re: debugger speed
Post by: rickg22 on January 04, 2006, 11:58:47 pm
grv: Is Quincy opensource? We might... *ahem* re-use *ahem* some of its code :lol:
Title: Re: debugger speed
Post by: mandrav on January 05, 2006, 12:36:52 am
IIRC gprof was a no go on the CB source.  Maybe I'll see if there's any good free assembly level call profilers that might be able to zero in on what's taking the most time on this machine.

You have to enable profiling only for one target at a time, not globally in project. This happens because, unfortunately, you can't specify an output file when using -pg...
So, just enable profiling on the debugger plugin only and you got yourself some profiling info ;)

Note though, that I 'm not finished with the debugger plugin. It has some optimization opportunities but it's still early for it...
Title: Re: debugger speed
Post by: grv575 on January 05, 2006, 01:08:28 am
grv: Is Quincy opensource? We might... *ahem* re-use *ahem* some of its code :lol:

"Quincy is freeware open-source."
http://www.codecutter.net/tools/quincy/

The source is 300k.  Haven't looked at it yet though.  I do know it's using gdb 5.2.1 and not the newer 6.3 but still could be useful to salvage some of the source anyway.
Title: Re: debugger speed
Post by: grv575 on January 05, 2006, 04:16:19 am
Compiling the latest source and running through the debugger again, it looks like I may have been a little harsh about the speed.  It's actually perfectly usable (F7 stepping) on my machine.  Optimization of course isn't a bad thing - I think I'll still profile it just out of curiosity - but it's decent enough to not be unacceptably slow.  Guess I remembered it taking longer to move the carret in previous builds, but as it is it gives a decent speed impression.
Title: Re: debugger speed
Post by: tiwag on January 05, 2006, 08:24:17 am
Compiling the latest source and running through the debugger again, it looks like I may have been a little harsh about the speed.  It's actually perfectly usable (F7 stepping) on my machine.  Optimization of course isn't a bad thing - I think I'll still profile it just out of curiosity - but it's decent enough to not be unacceptably slow.  Guess I remembered it taking longer to move the carret in previous builds, but as it is it gives a decent speed impression.


did you ever test an optimized ( by compiler switches ) build of CB ???  ( normal project file is for a debug build
and the update command only strips the output files, but no optimizations are done )

test this out (if you have another GB space left on your HD)  - you'll be astonished !
Title: Re: debugger speed
Post by: Ceniza on January 05, 2006, 08:28:21 am
My binary snapshots are already compiled with optimization flags, that would save him almost the whole GB :)
Title: Re: debugger speed
Post by: tiwag on January 05, 2006, 08:50:43 am
My binary snapshots are already compiled with optimization flags, that would save him almost the whole GB :)

thanks Ceniza  -  now  I know how i can save a GB  :D