This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
>> + ?// Count the number of strings in the section and size the list.
>> + ?size_t count = 0;
>> + ?for (const Char_type* pl = p; pl < pend; ++pl)
>> + ? ?{
>> + ? ? ?if (*pl == 0)
>> + ? ? ++count;
>> + ? ?}
>
> In the case where Char_type is char, I have a feeling this loop would be
> a tiny bit faster if written as
>
> ?const Char_type* pl = p;
> ?while (pl < pend)
> ? ?{
> ? ? ?pl += strlen(pl) + 1;
> ? ? ?if (pl > pend)
> ? ? ? ?warning(...);
> ? ? ?++count;
> ? ?}
>
> This is simply because the compiler will optimize strlen for the
> specific compilation target. ?See
> Stringpool_template<char>::string_length for a similar optimization in
> the Stringpool code.
Good idea -- that got a little over 1% speedup (measured with -O2). I
pulled the string_length template and its char specialization out of
the Stringpool_template class, and used that in both the counting and
the add-to-pool loops, after checking for string sections that don't
end in a null.
> Also, since you have the exact count, it would be a tiny bit better to
> allocate the vector at that size rather than allocating a default vector
> and then using reserve. ?You could this by adding a parameter to the
> Merged_strings_list constructor which is passed to merged_strings.
That turned out to hurt performance a bit (maybe -- the difference was
close to the noise), probably because of the default constructor for
each allocated element. I left this part as is.
Here's the patch as committed.
-cary
* merge.cc (Output_merge_string::do_add_input_section): Count strings
to reserve space in merged_strings vector. Keep total input size
for stats.
(Output_merge_string::do_print_merge_stats): Print total input size.
* merge.h (Output_merge_string): Add input_size_ field.
* stringpool.cc (Stringpool_template::string_length): Move
implementations out of Stringpool_template class and place in
stringpool.h.
* stringpool.h (string_length): Move out of Stringpool_template.
Attachment:
gold-merge-count-patch-2.txt
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |