Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

boost::bind и производительность

602
26 июня 2009 года
KPI Student
265 / / 16.12.2006
Решил ознкомиться с bind-ом, и его применениями. Штука классная, удобно, если не тыкать ее везде где можно - то полезная ичитабельная, все просто замечательно. Да еще и судя по всему эффективная, построена на inline-методах.

Решил протестить на скорость и вот что получил:
 
Код:
Sorting: std::sort + class-defined operator<...Time = 203

Sorting: std::sort + std::less + boost::bind...Time = 3806


То есть, падение производительности в 10 раз. Это в Release-версии, с включенной inline-подстановкой. Чем это можно объяснить?

Вот код:
Код:
class Telephone
{
public:
    Telephone( const string& h, const string& n) : m_name(h), m_number(n) {}

    void display()                          { cout << m_name << "\t: " << m_number << endl; }

    string name()                           { return m_name;   }
    string number()                         { return m_number; }

    bool   operator<(const Telephone& a)    { return m_name<a.m_name; }

private:
    string m_name;
    string m_number;
};
Код:
int _tmain(int argc, _TCHAR* argv[])
{
    const size_t ITERATIONS = 1000;
    const size_t COPIES     = 1000;

    std::vector<Telephone> customers;
    for (size_t i=0; i<COPIES; i++)
    {
        customers.push_back( Telephone("home",   "94-05-43") );
        customers.push_back( Telephone("work",   "799-99-99") );
        customers.push_back( Telephone("mobile", "708-45-57") );
    }


    std::vector<Telephone> array2 = customers;
    cout << endl << "Sorting: std::sort + class-defined operator<...";
    std::clock_t start = std::clock();

    for (size_t i = 0; i<ITERATIONS; i++)
        std::sort(array2.begin(), array2.end());

    std::clock_t finish = std::clock();
    cout << "Time = " << finish-start << endl;



    cout << endl << "Sorting: std::sort + std::less + boost::bind...";
    std::vector<Telephone> array = customers;
    start = std::clock();

    for (size_t i = 0; i<ITERATIONS; i++)
        std::sort(array.begin(), array.end(), boost::bind(std::less<string>(), boost::bind(Telephone::name, _1), boost::bind(Telephone::name, _2) ));

    finish = std::clock();
    cout << "Time = " << finish-start << endl;

    std::cin.get();
    return 0;
}
602
26 июня 2009 года
KPI Student
265 / / 16.12.2006
... на автора неожиданно снизошло прозрение: методы name() и number() вызывают конструктор копирования для std::string.

Вот так сравнение будет справедливее:
 
Код:
const string& name()                    { return m_name;   }
    const string& number()                  { return m_number; }


И тем не менее, имеет вот что:
 
Код:
Sorting: std::sort + class-defined operator<...Time = 171

Sorting: std::sort + std::less + boost::bind...Time = 1232


не понятно...
58K
06 марта 2010 года
im.valdik
3 / / 06.03.2010
Цитата: KPI Student

 
Код:
Sorting: std::sort + class-defined operator<...Time = 171
Sorting: std::sort + std::less + boost::bind...Time = 1232

не понятно...



У меня:

 
Код:
Sorting: std::sort + class-defined operator<...Time = 171
Sorting: std::sort + std::less + boost::bind...Time = 172


Visual C++ 2005, программа без изменений. Только поменял bind(Telephone::name, на bind(&Telephone::name
602
10 марта 2010 года
KPI Student
265 / / 16.12.2006
Йа зомби!!!!!! (я про тему)

Но все же спасибо, странно, я тогда недоглядел немного, и решил, что биндеры жутко медленные в циклах. Спасибо, что развеяли ошибочное убеждение!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог