четверг, 8 мая 2008 г.

как не стоит использовать STL + Boost

вот что получается когда слишком увлекаються "современным" с++:
(заметил на КЫВТ http://rsdn.ru/forum/message/2943714.1.aspx )
Добрый день!
Возникла проблема с производительностью boost::bind в следующем коде:

map<int,set<int>> back;
vector<int> docnums;

int xx = 0;
for (vector<int>::iterator ii = docnums.begin(); ii != docnums.end(); ii++) // первый вариант
xx += back[*ii].size();
// второй вариант
int yy = accumulate(
docnums.begin(),
docnums.end(),
0,
bind(
plus<int>(),
_1,
bind(
&set<int>::size,
bind(
&map<int,set<int>>::operator [],
back,_2)
)
)
);


в массиве 1 элемент, собирается всё как релизная версия, компилятор MSVC. 1-й вариант выполняется примерно 20 микросекунд, что вполне приемлемо. Но второй вариант выполняется 5000000 (!!!) микросекунд (т.е. около 5 секунд) и при этом выдаёт тоже правильный результат. Почему так невообразимо долго?
Павел


мало того что крутой второй вариант на пару парядков медленей, так он еще и не читабельный :) дальше второго вложеного bind желание разбирать его пропало(в оригинале весь второй вариант записан в одну строчку). Стиль написания напомнил анекдот(а может и реальную историю) про програмиста, который после выхода книжки банды четырех сумел заюзать все патерныны из нее в одной програмке, оно даже запустилось :)))
Вопрост, а почему бы не пользоваться первый вариантом, без притягивания за stl algorithms + bind, остаеться актуальным. А ведь так пишут - узнали что сейчас самое "крутое" и пробуют бездумно в любую дырку это засунуть

2 комментария:

Mamut комментирует...

звезда в шоке (с)

это же насколько надо самого себя не любить

Анонимный комментирует...

Ну не сказал бы, чтобы это был "современный с++" :). А вообще - сам иногда леплю потрясающие нагромождения из bind1st/2nd, select1st/2nd, compose и всяких прочих функторов, ибо далеко не все алгоритмы STL такие же тривиальные, как и accumulate (т. е. простым циклом не распишешь). А нормальный функтор писать, конечно же, влом, да и не слишком юзабельно, поскольку код этого функтора будет располагаться далеко от места использования.

Но ничего, после выхода C++0x, в котором наконец-то появятся лямбды и замыкания, все изменится к лучшему:).