Sorting: std::sort + class-defined operator<...Time = 203
Sorting: std::sort + std::less + boost::bind...Time = 3806
boost::bind и производительность
Решил протестить на скорость и вот что получил:
Код:
То есть, падение производительности в 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;
};
{
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;
}
{
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;
}
Вот так сравнение будет справедливее:
Код:
const string& name() { return m_name; }
const string& number() { return m_number; }
const string& number() { return m_number; }
И тем не менее, имеет вот что:
Код:
Sorting: std::sort + class-defined operator<...Time = 171
Sorting: std::sort + std::less + boost::bind...Time = 1232
Sorting: std::sort + std::less + boost::bind...Time = 1232
не понятно...
Цитата: KPI Student
Код:
Sorting: std::sort + class-defined operator<...Time = 171
Sorting: std::sort + std::less + boost::bind...Time = 1232
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
Sorting: std::sort + std::less + boost::bind...Time = 172
Visual C++ 2005, программа без изменений. Только поменял bind(Telephone::name, на bind(&Telephone::name
Но все же спасибо, странно, я тогда недоглядел немного, и решил, что биндеры жутко медленные в циклах. Спасибо, что развеяли ошибочное убеждение!