std.algorithm.copy could be better optimized
TommiT
tommitissari at hotmail.com
Mon Jun 17 18:14:04 PDT 2013
On Monday, 17 June 2013 at 17:43:25 UTC, Andrei Alexandrescu
wrote:
> On 6/17/13 1:36 PM, TommiT wrote:
>> std.algorithm.copy adheres to the specification of the C++
>> standard
>> library function std::copy. That specification states that the
>> source
>> and target ranges may not overlap. Yet, all the major C++
>> standard
>> libraries (libc++, libstdc++, Dinkum C++ Library) implement
>> std::copy so
>> that it becomes a memmove if the source and target element
>> types are the
>> same and the element type is
>> std::is_trivially_copy_assignable. Thus,
>> the current C++ specification seems to be too strict.
>>
>> The current std.algorithm.copy implementation doesn't get
>> optimized into
>> a memmove when it would be safe to do so. It really should,
>> because it's
>> the fastest way to get the job done, and it allows the ranges
>> to
>> overlap. Also, the documentation should be changed to notify
>> of this
>> relaxation.
>>
>> There's some benchmarks of memmove vs other methods:
>> http://nadeausoftware.com/articles/2012/05/c_c_tip_how_copy_memory_quickly
>
> Bugzilla. FWIW I did notice Duff can sometimes beat memmove,
> but that was some 10 years ago.
>
> Andrei
Another thing that comes to mind is that...
R find(alias pred = "a == b", R, E)(R haystack, E needle)
...could be optimized, when pred is "a == b", R is an array of
E's, and E is either char, byte or ubyte, to call the c function
memchr instead. It's a bit tricky though: quite recently a bug
was found in this particular optimization in the standard library
that ships with Visual Studio, as described in this interesting
tutorial:
http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-7-of-n
More generally, what I'm saying is that we should probably just
go through some good C++ standard library implementation and copy
all the optimizations that they have done. I'm sure there's much
more.
More information about the Digitalmars-d
mailing list