std::copy is much slower than memmove

Bug #656980 reported by Lucas Clemente Vella
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
gcc-4.4 (Ubuntu)
New
Undecided
Unassigned

Bug Description

Binary package hint: gcc-4.4

According to "/usr/include/c++/4.4.3/bits/stl_algobase.h", on regarding std::copy, "This inline function will boil down to a call to @c memmove whenever possible." But it is not true, you can see in a very simple test:

test_copy.cpp:
int main()
{
  int *b1 = new int[1024*1024];
  int *b2 = new int[1024*1024];

  for(int i = 0; i < 10000; ++i) {
    std::copy(b1, b1 + (1024*1024), b2);
    std::copy(b2, b2 + (1024*1024), b1);
  }
}

teste_mmove.cpp:
int main()
{
  int *b1 = new int[1024*1024];
  int *b2 = new int[1024*1024];

  for(int i = 0; i < 10000; ++i) {
    memmove(b2, b1, 1024*1024);
    memmove(b1, b2, 1024*1024);
  }
}

$ time ./test_copy
real 0m14.060s
user 0m14.040s
sys 0m0.000s

$ time ./test_mmove
real 0m2.310s
user 0m2.310s
sys 0m0.000s

The execution time of std::copy is about 600% of memmove's time in this test (and I don't know why the header file talks about memmove, and not memcpy). It is certainly a bug, because it contradicts what the header says, and there should be no reason to std::copy to be slower than memcpy when applied to bare pointers.

Tested with:
gcc-4.4 - 4.4.3-4ubuntu5
libstdc++6-4.4-dev - 4.4.3-4ubuntu5

description: updated
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.