[patch] debug mode
François Dumont
francois.cppdevs@free.fr
Wed Aug 18 19:32:00 GMT 2010
On 08/18/2010 03:11 PM, Paolo Carlini wrote:
> Hi,
>
> a few comments before my vacation days. In general the new patch looks
> pretty good, some comments below.
>
>> Hello
>>
>> Here is my new patch proposition:
>>
>> - I have tested it on x86_64 linux with make check. make debug-check
>> gives me the same failures with or without the patch, the failures
>> looks normal ones to me. For instance the synopsis.cc tests are all
>> failing because of ambiguity between std::vector and
>> std::__debug::vector, other tests are failing because of tests
>> involving the profile mode.
>>
> Well, before your patch only the synopsis.cc testcases are failing,
> right? Please make sure we don't regress about that, even by way of
> undefs, or whatever other trick, thanks.
>
No, there were AFAIR 22 failures, the same one with or without the
tests. Do you mean that I should undef _GLIBCXX_DEBUG when the test
don't work with it ? If so I could perhaps do so in an other patch
dedicated to fixing the debug-check target.
>> - 80 columns
>>
>> Sorry about that I looked for the number of chars and not the
>> number of columns, because of tabulations it is not equal. By the way,
>> are tabulations ok ? Most of projects I work on was forbidding tabs,
>> should I consider that tabs are 8 spaces long ? To fix this problem I
>> replace many __first, __last by respectively __f, __l, I hope it is fine.
>>
> Certainly tabs are not forbidden, but the indentations must be right, 2
> chars wide each, essentially.
Really, with such a width indentation is not right in files I work on,
with width 8 it looks better.
> About __first and __last, I would suggest
> not changing those to __f and __l if at all possible: short names are
> always more dangerous vs BADNAMES on some less widespread machines.
>
Ok, I will fix it an other way then
>> - Performance gain
>>
>> This patch contains 4 new performance tests to challenge range
>> constructors of different containers instanciated with int type:
>> deque_construct: deque instances built from a vector [begin, end[
>> range
>> list_construct1: list instances built from a vector [begin, end[
>> range
>> list_construct2: list instances built from a list [begin, end[ range
>> vector_construct: vector instances built from a vector [begin,
>> end[ range
>>
>> When run in release mode it gives the following results:
>> deque_construct.cc
>> 11r 9u 1s 0mem 0pf
>> list_construct1.cc 343r
>> 341u 0s 0mem 0pf
>> list_construct2.cc 346r
>> 346u 0s 0mem 0pf
>> vector_construct.cc
>> 8r 2u 5s 0mem 0pf
>>
>> deque and vector build are much faster because thanks to internal
>> optimizations it relies on memmove.
>>
>> Once run with _GLIBCXX_DEBUG defined without the patch it gives:
>>
>> deque_construct.cc 529r
>> 523u 2s 0mem 0pf
>> list_construct1.cc 895r
>> 890u 1s 0mem 0pf
>> list_construct2.cc 884r
>> 879u 1s 0mem 0pf
>> vector_construct.cc 475r
>> 467u 6s 0mem 0pf
>>
>> All tests are taking much more time. list_construct1 and
>> list_construct2 because we need more time to check safe iterators on
>> each initialization, deque_construct and vector_construct because
>> usage of safe iterators disable completely usage of memmove and so
>> once again we have to check each safe iterators each time we increment
>> the safe iterator.
>>
>> With the proposed patch we have:
>>
>> deque_construct.cc
>> 11r 7u 2s 0mem 0pf
>> list_construct1.cc 341r
>> 339u 0s 0mem 0pf
>> list_construct2.cc 865r
>> 861u 1s 0mem 0pf
>> vector_construct.cc
>> 9r 3u 4s 0mem 0pf
>>
>> As soon as we detect random access safe iterator we check the
>> whole range in a single operation and there is no more overhead on
>> each iterator incrementation. Moreover for deque construct and vector
>> construct we restore usage of memmove. Only list_construct2 is not
>> impacted because we are not able to validate the iterator range in a
>> single operation so we still have the overhead of checking it each
>> time we increment the safe iterator internally.
>>
> Looks good. But if we are talking about performance, those tests belong
> to testsuite/performance and should use the timing infrastructure
> already in place.
>
>> - Modifications of functions.h
>>
>> The only point that I am not fully comfortable with is that I had
>> to introduce a declaration of __check_singular in formatter.h in order
>> to have functions.h to depend on formatter.h and not the opposite as
>> it used to be when formatter.h was including debug.h. If you do not
>> like it I can introduce a new header to define __check_singular and
>> associated __check_singular_aux that will be overloaded in
>> safe_iterator.h. Except that I think modifications are correct and as
>> a matter of fact the test suite did not show any problem.
>>
> Ok, let's give that a bit more testing (maybe normal make-check too, but
> *without* PCHs? Normally I do that when I change the header dependencies).
>
> Also, I see various testcases defining explicitly _GLIBCXX_DEBUG:
> normally we don't do that: check-debug takes care of testing the
> debug-mode behavior, uniformly. Please see if you can remove those
> explicit defines in the testcases.
>
Those tests are checking that invalid code is correctly detected thanks
to the debug mode so I force definition of _GLIBCXX_DEBUG. Is there some
way to make those tests unsupported when run in normal mode ?
> Finally, the *cont_traits.h headers should also use a correct style, no
> open bracket at the end of a line, I would also recommend a minimum of
> "air" between the lines, and make up your mind, either you uglify (eg,
> _It), or not (eg, first). I would say not, for testcases.
>
Ok
> Paolo.
>
More information about the Libstdc++
mailing list