boost::variant в 25 раз медленнее union
От: Disappear  
Дата: 21.09.07 10:48
Оценка:
Привел тесты. Покритикуйте плиз, если что не так.
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? Для каких задач?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.