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? Для каких задач?
Re: boost::variant в 25 раз медленнее union
От: Smal Россия  
Дата: 21.09.07 11:25
Оценка:
Здравствуйте, Disappear, Вы писали:

D>Привел тесты. Покритикуйте плиз, если что не так.

D>MSVC 8.1, Northwood P4 3.0Ghz

D>Невольно в голову лезет фраза — самые эффективные инструменты, это инструменты языка.


D>Стоит-ли использовать boost::variant? Для каких задач?


Комментарий №1 : Нельзя использовать имена начинающиеся с подчеркивания за которым следует заглавная буква.
Комментарий №2 : Этот цикл 100% будет выкинут оптимизатором ибо тут ничего не делается
D>        for (int i = 0; i < nElems; ++i)
D>        {
D>            int a = pUn[i].a.a;            
D>        }

Это может произойти и с другими кусками кода. Для того, что бы оптимизатор их не выкидывал надо делать дополнительные действия.
К примеру
int  a = 0;
for (int i = 0; i < nElems; ++i)
{
   a += pUn[i].a.a;            
}
//...

return a;

Комментарий №3 : Насколько я понимаю boost::variant типобезопасен и может хранить не POD типы (Я прав?).
Если так, то сравнивать их только по скорости не очень корректно.
С уважением, Александр
Re: boost::variant в 25 раз медленнее union
От: Sni4ok  
Дата: 21.09.07 11:29
Оценка:
Здравствуйте, Disappear, Вы писали:

D>Невольно в голову лезет фраза — самые эффективные инструменты, это инструменты языка.


ты не заюзаешь union для не pod типов, но boost::variant быстрее полиморфизма

D>Стоит-ли использовать boost::variant? Для каких задач?


для техже самых задач, где хочется заюзать union, но стандарт запрещает
Re[2]: boost::variant в 25 раз медленнее union
От: Disappear  
Дата: 21.09.07 12:05
Оценка:
Здравствуйте, Smal, Вы писали:

S>Здравствуйте, Disappear, Вы писали:


D>>Привел тесты. Покритикуйте плиз, если что не так.

D>>MSVC 8.1, Northwood P4 3.0Ghz

S>Комментарий №1 : Нельзя использовать имена начинающиеся с подчеркивания за которым следует заглавная буква.

да

S>Комментарий №2 : Этот цикл 100% будет выкинут оптимизатором ибо тут ничего не делается

Это я конечно упустил
Со вторым циклом, стало несколько хуже в сторону variant

Variant time: 60.106
Union time: 2.172

S>Комментарий №3 : Насколько я понимаю boost::variant типобезопасен и может хранить не POD типы (Я прав?).

S>Если так, то сравнивать их только по скорости не очень корректно.
Все верно. Но, некоторые компилеры и не POD пропускают.

В C++0x случайно не хотят встроить типобезопысный union?
Re[3]: boost::variant в 25 раз медленнее union
От: Smal Россия  
Дата: 21.09.07 13:10
Оценка:
Здравствуйте, Disappear, Вы писали:

S>>Комментарий №2 : Этот цикл 100% будет выкинут оптимизатором ибо тут ничего не делается

D>Это я конечно упустил
D>Со вторым циклом, стало несколько хуже в сторону variant
Это я к тому, что в таких случаях нужно смотреть дизассемблер. Ибо порой сложно угадать, что он выкинет.

S>>Комментарий №3 : Насколько я понимаю boost::variant типобезопасен и может хранить не POD типы (Я прав?).

S>>Если так, то сравнивать их только по скорости не очень корректно.
D>Все верно. Но, некоторые компилеры и не POD пропускают.
Это их проблемы. Деструктор они все-равно звать не будут .

D>В C++0x случайно не хотят встроить типобезопысный union?

ХЗ Я не слышал.
С уважением, Александр
Re: boost::variant в 25 раз медленнее union
От: Roman Odaisky Украина  
Дата: 21.09.07 17:13
Оценка:
Здравствуйте, Disappear, Вы писали:

D>Стоит ли использовать boost::variant? Для каких задач?


Стоит, для тех задач, для которых приемлемы поведение и производительность boost::variant.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.