Привел тесты. Покритикуйте плиз, если что не так.
MSVC 8.1, Northwood P4 3.0Ghz
Результат:
Variant time: 58.872
Union time: 2.234
#include <iostream>
#include <boost/variant.hpp>
#include <boost/timer.hpp>
struct A { int a; };
struct _A
{
_A() {}
_A(int _a) : a(_a) {}
int a;
};
union myun
{
A a;
int ccc;
};
class my_visitor : public boost::static_visitor<int>
{
public:
int operator()(int c) const
{
assert(false);
return c;
}
int operator()(const _A& a) const
{
return a.a;
}
};
typedef boost::variant<_A, int> myvar;
int main()
{
const int nElems = 1000000;
const int nRepeats = 1000;
myun* pUn = new myun[nElems];
myvar* pVar = new myvar[nElems];
boost::timer tim;
for (int k = 0; k < nRepeats; ++k)
{
for (int i = 0; i < nElems; ++i)
{
pVar[i] = (nElems - i);
pVar[i] = _A(i);
}
for (int i = 0; i < nElems; ++i)
{
int a = boost::apply_visitor(my_visitor(), pVar[i]);
}
}
std::cout << "Variant time: " << tim.elapsed() << std::endl;
tim.restart();
for (int k = 0; k < nRepeats; ++k)
{
for (int i = 0; i < nElems; ++i)
{
pUn[i].ccc = (nElems - i);
A a; a.a = i;
pUn[i].a = a;
}
for (int i = 0; i < nElems; ++i)
{
int a = pUn[i].a.a;
}
}
std::cout << "Union time: " << tim.elapsed() << std::endl;
delete [] pUn;
delete [] pVar;
return 0;
}
Невольно в голову лезет фраза — самые эффективные инструменты, это инструменты языка.
Стоит-ли использовать boost::variant? Для каких задач?