Складывается впечатление, что возражающим Kluev-у товарищам, вероятно, никогда не приходилось выбрасывать из программы вещи типа std::string, std::stringstream и std::set/map после работы с профайлером.
boost::lexical_cast, как и std::stringstream, изрядный тормоз и для некоторых вещей применять его совершенно неразумно. Вне зависимости о того, правомерно ли Kluev охаивает качество boost-а или нет.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Kluev, Вы писали:
K>Здравствуйте, alexeiz, Вы писали:
A>>Здравствуйте, Kluev, Вы писали:
A>>Если взглянуть на профайл, что я боюсь, тебе сделать не удалось (по причине либо отсутствия профайлера, либо неумения им пользоваться), то видно, что это очередной micro-benchmark, который ничего не значит. Кстати lexical_cast'а в профайле вообще не видно (оптимизация, понимаешь!).
K>Профайлер здесь и не нужен. Я посмотрел в исходники и обнаружил там быдлокодец вокруг iostream. K>Кстати, в недрах этого чуда несколько раз вызывается new, поэтому производительность в реальных условиях будет еще сильно зависить от состояния кучи. А сам факт динамического выделения памяти для операции string -> number говорит о низкой культуре программирования у бустовских кодеров. Видимо на первом месте в бусте стоит "чистота концепций", а все остальные вопросы игнорируются.
Странный ты человек. Взгляни хоть на профайл один раз. Где там вызывается new? Пока что ты здесь занимаешься игнорированием а не бустовские кодеры.
Здравствуйте, alexeiz, Вы писали:
A>Странный ты человек. Взгляни хоть на профайл один раз. Где там вызывается new? Пока что ты здесь занимаешься игнорированием а не бустовские кодеры.
Здравствуйте, CreatorCray, Вы писали:
Z>> В стандартных библиотечных функций, как минимум можно знать чего ожидать, или во всяком случае куда обращаться. CC>Они ничуть не лучше нормально написанных, оттестированных и задокументированных "велосипедных" функций.
К сожалению я не могу разработать аналоги многих библиотек , в том числе буста с таким же качеством. Надеюсь это не моя бездарномть а просто нехватка ресурсов. Хочу работать в фирме которая готова разрабатывать библиотеки качественее буста.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Kluev
E>Складывается впечатление, что возражающим Kluev-у товарищам, вероятно, никогда не приходилось выбрасывать из программы вещи типа std::string, std::stringstream и std::set/map после работы с профайлером.
Ты попал в точку. Мне не разу в жизни не пришлось выбрасывать "std::string, std::stringstream и std::set/map после работы с профайлером." Наверное я не дорос то того уровня абстракции.
А вот код где конкатенация строк оптимизировалась заменой std::string на strcpy видел.
E>boost::lexical_cast, как и std::stringstream, изрядный тормоз и для некоторых вещей применять его совершенно неразумно. Вне зависимости о того, правомерно ли Kluev охаивает качество boost-а или нет.
Подозреваю что это очевидно для людей интенсивно использующих буст ?
int num_parse
(
double *num,
const char **stop,
const char *p,
const char *end
)
{
i64 ct;
int neg;
double val;
int ep;
int ep_neg;
uchar c;
int digs;
double tmp;
static CharType ctype;
for ( ;; ) {
if ( p < end )
ct = ctype.type( c = *p );
else
goto err_eof;
if ( ct & char_t::space )
++p;
else
break;
}
if ( ct & char_t::sign ) {
neg = ( '-' == c );
if ( ++p == end )
goto err_eof;
ct = ctype.type( c = *p );
}
else
neg = false;
// first charif ( ct & char_t::digit )
{ val = c - '0'; ++p; }
else if ( '.' == c )
{ val = 0; ++p; digs = 0; goto dot_ok; }
for (;;) {
if ( p < end )
ct = ctype.type( c = *p );
else
goto ip_eof;
if ( ct & char_t::digit )
val = val * 10 + (c-'0');
else
goto ip_ok;
++p;
}
ip_ok:
digs = 0;
if ( '.' != c )
goto fp_ok;
else
++p;
dot_ok:
for (;;) {
if ( p < end )
ct = ctype.type( c = *p );
else
goto fp_eof;
if ( ct & char_t::digit ) {
val = val * 10 + (c-'0');
--digs;
}
else
goto fp_ok;
++p;
}
fp_ok:
if ( 'E' == c || 'D' == c || 'e' == c || 'd' == c )
++p;
else
goto fp_eof;
if ( p == end )
goto err_eof;
ct = ctype.type( c = *p );
if ( ct & char_t::sign ) {
ep_neg = ( '-' == c );
if ( ++p == end )
goto err_eof;
else
ct = ctype.type( c = *p );
}
else
ep_neg = false;
// first charif ( ct & char_t::digit )
{ ep = c - '0'; ++p; }
else
goto err_syntax;
for ( ;; ) {
if ( p < end )
ct = ctype.type( c = *p );
else
break;
if ( ct & char_t::digit ) {
ep = ep * 10 + (c-'0');
}
else
break;
++p;
}
if ( ep_neg )
digs -= ep;
else
digs += ep;
*stop = p;
tmp = pow( 10., digs );
*num = neg ? -(tmp * val) : tmp * val;
return num_parse_ok;
ip_eof:
*stop = p;
*num = neg ? 0.-val : val;
return num_parse_ok;
fp_eof:
*stop = p;
tmp = pow( 10., digs );
*num = neg ? -(tmp * val) : tmp * val;
return num_parse_ok;
err_eof:
*stop = p;
// *num = 0;return num_parse_eof;
err_syntax:
*stop = p;
// *num = 0;return num_parse_syntax;
}
Re[2]: boost - вон из профессии
От:
Аноним
Дата:
12.06.08 21:31
Оценка:
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Kluev
E>Складывается впечатление, что возражающим Kluev-у товарищам, вероятно, никогда не приходилось выбрасывать из программы вещи типа std::string, std::stringstream и std::set/map после работы с профайлером.
Ну да, приходится переодически менять структуру данных X на Y и алгоритм Foo на Bar.
Тоже мне откровение
Здравствуйте, minorlogic, Вы писали:
M>К сожалению я не могу разработать аналоги многих библиотек, в том числе буста с таким же качеством.
Работай над этим
M> Надеюсь это не моя бездарномть а просто нехватка ресурсов.
а также времени и желания...
M> Хочу работать в фирме которая готова разрабатывать библиотеки качественее буста.
Их много. Не надо считать что буст идеален в плане качества.
Буст начинал как как большой репозиторий бесплатных велосипедов куда каждый мог выложить свой велосипед на peer-review.
Подробнее здесь: http://www.boost.org/users/proposal.pdf
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Kluev
E>Складывается впечатление, что возражающим Kluev-у товарищам, вероятно, никогда не приходилось выбрасывать из программы вещи типа std::string, std::stringstream и std::set/map после работы с профайлером.
std:string сотоварищами выбрасывать не приходилось. Приходилось выбрасывать глючный быдлокод, который рожали исходи из вот такого "был std::string и все тормозило". Не говоря уже о раздаче люлей любителям передавать контейнеры по значению и профилировать отладочную сборку.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Kluev
E>Складывается впечатление, что возражающим Kluev-у товарищам, вероятно, никогда не приходилось выбрасывать из программы вещи типа std::string, std::stringstream и std::set/map после работы с профайлером.
Приходилось, конечно, но почему-то ни разу в голову не пришло заявить "boost/ACE/STL/C++/whatever — вон из профессии"
И скорее всего потому, что на одно выброшенное приходится десять невыброшенных, которые отлично в своих ситуациях работают, давая простой и прозрачный для понимания код.
E>boost::lexical_cast, как и std::stringstream, изрядный тормоз и для некоторых вещей применять его совершенно неразумно. Вне зависимости о того, правомерно ли Kluev охаивает качество boost-а или нет.
А с этим никто и не спорит. Просто "некоторые вещи" и "boost — вон из профессии" несколько несовместимы по уровню обобщения.
E>Складывается впечатление, что возражающим Kluev-у товарищам, вероятно, никогда не приходилось выбрасывать из программы вещи типа std::string, std::stringstream и std::set/map после работы с профайлером.
Честно говоря — выбрасывать нет, не приходилось
Здравствуйте, anc, Вы писали:
anc>это не аналог strtod() — нет обработки overflow/underflow и напомнило http://www.rsdn.ru/forum/message/2795063.1.aspx
проверки нет потому что можно проверить результат на INF, хотя я согласен, что логичней сделать это внутри функции.
anc>откуда CharType?
Другой велосипед
anc>тест не правильный — выносить из цикла подсчета времени нельзя!
внутри функции можно легко заменить проверку p < end на *p, но мне было влом поэтому я просто поставил strlen
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Kluev
E>Складывается впечатление, что возражающим Kluev-у товарищам, вероятно, никогда не приходилось выбрасывать из программы вещи типа std::string, std::stringstream и std::set/map после работы с профайлером.
Мне не приходилось. Я их к своим программам, когда изначально известно, что нужна скорость, близко не подпускаю
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Kluev
E>Складывается впечатление, что возражающим Kluev-у товарищам, вероятно, никогда не приходилось выбрасывать из программы вещи типа std::string, std::stringstream и std::set/map после работы с профайлером.
E>boost::lexical_cast, как и std::stringstream, изрядный тормоз и для некоторых вещей применять его совершенно неразумно. Вне зависимости о того, правомерно ли Kluev охаивает качество boost-а или нет.
А у меня складывается впечатление что я много не понимаю. в каком варианте использования может быть важна производительность операций со сторками , парсинг и конвертирование? Я могу предположить что в парсере больших текстов или в неком сервере под нагрузкой с большим к-вом запросов.
А теперь вопрос , это кому в голову опять приходит мысль использовать вместо специализированных парсеров свои велосипеды на std::string, std::stringstream? Ах да , бесстрашным героям которые пишут библиотеки лучше буста. Слава героям капиталистического труда.
Вообще довольно странная мысль использовать инструменты не по назначению , и потом сетовать , дескать мой микроскоп плохо кривые гвозди бьет. Я вот недавно каменный топор сделал , так он эти гвозди одним ударом.
"boost::lexical_cast" даже по названию может прити в голову что это не инструмент конвертирования строки в дабл а некий универсальный преобразователь типов. И что варианты его использования предполагают и неимение информации о типе (я имею ввиду шаблонные конструкции).
Я не собираюсь идеализировать буст , тем более что он состоит из множества гетерогенных библиотек, но как бы и не хочется оставить без внимания воинствующую безграмотность. Для критики какой либо из бустовских библиотке (а весь буст критиковать это просто безграмотно) надо было бы рассотреть для чего она написанна, варианты использования , и предложить альтернативу лучше удовлетворяющую поставленным задачам.