
Boost : 
From: Howard Hinnant (hinnant_at_[hidden])
Date: 20080624 11:37:18
On Jun 23, 2008, at 3:54 PM, David Abrahams wrote:
> I haven't formed an opinion yet, but the fact remains that swapping a
> boost::array would have very different efficiency characteristics from
> swapping the analogous std::vector, so we ought to think it through
> carefully.
If it helps, here is a test program using gcc 4.0.1:
#include <iostream>
#include <vector>
#include <tr1/array>
#include <ctime>
template <class T, std::size_t N>
void
swap1(std::tr1::array<T, N>& a, std::tr1::array<T, N>& b)
{
std::tr1::array<T, N> temp(a);
a = b;
b = temp;
}
template <class T, std::size_t N>
void
swap2(std::tr1::array<T, N>& a, std::tr1::array<T, N>& b)
{
std::swap_ranges(a.begin(), a.end(), b.begin());
}
int main()
{
std::tr1::array<std::vector<int>, 1000> a;
for (unsigned i = 0; i < a.size(); ++i)
a[i] = std::vector<int>(10000);
std::tr1::array<std::vector<int>, 1000> b(a);
std::clock_t t1 = std::clock();
swap1(a, b);
std::clock_t t2 = std::clock();
std::cout << "swap1 time is " << double(t2  t1) / CLOCKS_PER_SEC
<< " seconds\n";
t1 = std::clock();
swap2(a, b);
t2 = std::clock();
std::cout << "swap2 time is " << double(t2  t1) / CLOCKS_PER_SEC
<< " seconds\n";
}
On my machine:
$ g++ O3 test.cpp
$ ./a.out
swap1 time is 0.172796 seconds
swap2 time is 1.3e05 seconds
I also note that swap1 can throw exceptions and swap2 can't. I also
note that move semantics will greatly speed swap1, and make it
nothrow, but I still expect swap1 with move semantics to be about
twice as slow as swap2.
Howard
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk