BOOST::lexical_cast, .NET short.Parse и производительность..
От: Denis2005 Россия  
Дата: 11.11.06 16:56
Оценка:
Кхм... Опять смущает производительность библиотеки BOOST.

Тест C++/BOOST:

#include <boost/lexical_cast.hpp>
#include <iostream>

int MyStrToShort(const char *cs)
{
    int res = 0;    
    for(int i = 0; i < 10000000; i++)
    res += lexical_cast<short>(cs);
    return res;
}


int _tmain(int argc, _TCHAR* argv[])
{    
    cout << MyStrToShort("123");
    return 0;
}


Компилятор: MS VC8.0.50727.42
Опции: /Ox /Oy /I "C:\WORK\boost_1_32_0\\" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
"_VC80_UPGRADE=0x0700" /D "_MBCS" /FD /EHsc /MT /GS- /Gy /Za /Yu"stdafx.h"
/Fp"Release\aaa.pch" /FA /Fa"Release\\" /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c
/Wp64 /Zi /TP /errorReport:prompt /D_SECURE_SCL=0
Время работы: ~35 сек.



Тест .NET (c#):

using System;

static int MyStrToShort(string cs)
{
    int res = 0;    
    for(int i = 0; i < 10000000; i++)
    res += short.Parse(cs);
    return res;
}

static void Main(string[] args)
{    
    Console.WriteLine( MyStrToShort("123") );
}


Опции: Release
Время работы: ~2 сек (без учета JIT-компиляции).

Я уж тут подумал на кривизну рук, но..., прошу объяснить где кривые руки в использовании boost::lexical_cast?

Раньше я пользовался C++/STL для того, чтобы обогнать .NET и прочее.
теперь, я пользуюсь .NET, чтобы обогнать C++/BOOST.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: BOOST::lexical_cast, .NET short.Parse и производительнос
От: FR  
Дата: 11.11.06 17:01
Оценка:
Здравствуйте, Denis2005, Вы писали:

D>Кхм... Опять смущает производительность библиотеки BOOST.


Так boost::lexical_cast вроде общеизвестный пример тормозов в бусте, так что боянишь
Re: BOOST::lexical_cast, .NET short.Parse и производительнос
От: Cyberax Марс  
Дата: 11.11.06 17:10
Оценка:
Denis2005 wrote:
> Кхм... Опять смущает производительность библиотеки *BOOST*.
lexical_cast — это ТОРМОЗЗЗЗ.

Хотя в следующем Бусте добавили его оптимизацию, так что можешь
потестить с новым Boost RC.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re: BOOST::lexical_cast, .NET short.Parse и производительнос
От: Андрей Хропов Россия  
Дата: 11.11.06 18:54
Оценка:
Здравствуйте, Denis2005, Вы писали:

Эхх, надо бы бенчмарк для разных языков снова устроить, да я вот еще для него фреймворк не написал .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
[Benchmark] DMD опять быстрее всех. Даже чем atoi :)
От: Андрей Хропов Россия  
Дата: 11.11.06 22:17
Оценка: 2 (2) :)
Здравствуйте, Андрей Хропов, Вы писали:

Короче я все таки не удержался , тем более что с прошлого бенчмарка всего везде по одной строчке надо были поправить.
Ну и IronPython и Руби до кучи добавил.

Вот усредненные по 5 прогонам после первого (в цикле) результаты (Pentium M 1.7 Dothan):

РеализацияВремя
1) DMD 0.173 (std.conv.toInt)0.277 sec
2) MinGW GCC 3.4.2 (atoi)0.345 sec
3) MS VC++ 8.0 (atoi)0.645 sec
4) C# on Mono 1.1.18 (int.Parse)1.023 sec
5) Java on HotSpot 1.5.0_08(-server) (Integer.decode)1.796 sec
6) Java on JRockit 26.4.0(-server) (Integer.decode)1.969 sec (на первом прогоне 2.905 sec)
7) C# on .NET 2.0 (int.Parse)2.899 sec
8) CPython 2.4.2 + Psyco 1.5 (int())5.406 sec
9) IronPython 1.0 on Mono 1.1.18 (int())10.625 sec
10) IronPython 1.0 on .NET 2.0 (int())10.685 sec
11) CPython 2.4.2 (int()) 11.218 sec
12) Ruby 1.8.5 (to_i) 16.714 sec
13) MinGW GCC 3.4.2
(boost 1.33.1::lexical_cast<int>)
21.305 sec
14) MS VC++ 8.0
(boost 1.33.1::lexical_cast<int>)
51.700 sec
Так что иногда и Руби быстрее C++ .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: BOOST::lexical_cast, .NET short.Parse и производительнос
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.11.06 02:26
Оценка:
Здравствуйте, Denis2005, Вы писали:

Кстати, Parse реализован не самым оптимальным образом. Ручная реализация обычно быстрее.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: BOOST::lexical_cast, .NET short.Parse и производитель
От: Denis2005 Россия  
Дата: 12.11.06 09:04
Оценка: +1 :)
Здравствуйте, VladD2, Вы писали:

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


VD>Кстати, Parse реализован не самым оптимальным образом. Ручная реализация обычно быстрее.


Меня в этом вопросе волнует другое...
Еще буквально 3-4 года назад почти каждый бравый C++-ник кидался тухлым помидором во всё,
"что не C++" и любой разговор сводил к производительности,
с чем конечно поспорить было трудно (в частности связка C++/STL
на хорошем компиляторе это просто улет).
Однако с приходом BOOST-омании как-то понятия С++ и производительность
разъехались по разные стороны, а собственно "комитет", который постоянно твердил
о т.н. нулевых издержках сейчас получается сам себе противоречит,
и собирается включать в C++0x всякое фуфло из BOOST-а.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: BOOST::lexical_cast, .NET short.Parse и производитель
От: FR  
Дата: 12.11.06 09:32
Оценка:
Здравствуйте, Denis2005, Вы писали:

D>Однако с приходом BOOST-омании как-то понятия С++ и производительность

D>разъехались по разные стороны, а собственно "комитет", который постоянно твердил
D>о т.н. нулевых издержках сейчас получается сам себе противоречит,
D>и собирается включать в C++0x всякое фуфло из BOOST-а.

Не надо рассматривать boost как монолит, это скорее россыпь почти не связанных библиотек. Большая часть из них весьма полезны и высокопроизводительны, но есть и несколько уродцев.
Re: [Benchmark] DMD опять быстрее всех. Даже чем atoi :)
От: CreatorCray  
Дата: 12.11.06 10:29
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

АХ>Так что иногда и Руби быстрее C++ .

Вернее так: иногда и Руби быстрее BOOST

Ради интереса сделал тестик с использованием своей библы, которая у меня на производительность затачивается. С учетом того, что она работает только с Unicode (WCHAR) получилось на P4 521 (2800 Gz) 472347379 тиков (rdtsc) или 0.168693 секунд.
Так штааа это проблемы буста а не С++
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: [Benchmark] DMD опять быстрее всех. Даже чем atoi :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.11.06 11:06
Оценка: +2
Здравствуйте, Андрей Хропов, Вы писали:

Не совсем корректно сравнивать atoi и дотнетный int.Parse, потому что последний понимает разделители и группировки, знаки валют, текущую культуру, NumberFormat.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[4]: BOOST::lexical_cast, .NET short.Parse и производитель
От: Denis2005 Россия  
Дата: 12.11.06 12:35
Оценка:
Здравствуйте, FR, Вы писали:

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


D>>Однако с приходом BOOST-омании как-то понятия С++ и производительность

D>>разъехались по разные стороны, а собственно "комитет", который постоянно твердил
D>>о т.н. нулевых издержках сейчас получается сам себе противоречит,
D>>и собирается включать в C++0x всякое фуфло из BOOST-а.

FR>Не надо рассматривать boost как монолит, это скорее россыпь почти не связанных библиотек. Большая часть из них весьма полезны и высокопроизводительны, но есть и несколько уродцев.


BOOST.Devel в курсе проблемы производительности некоторых своих компонент и при этом мало, что делает.
В данном случае (lexical_cast) BOOST.Devel рекомендует делать специализации, использующие strtol и strtod.

P.S. Если не трудно перечисли список уродцев, чтоб я зря время не тратил на тесты?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: BOOST::lexical_cast, .NET short.Parse и производитель
От: FR  
Дата: 12.11.06 12:52
Оценка: :)
Здравствуйте, Denis2005, Вы писали:


D>BOOST.Devel в курсе проблемы производительности некоторых своих компонент и при этом мало, что делает.

D>В данном случае (lexical_cast) BOOST.Devel рекомендует делать специализации, использующие strtol и strtod.



D>P.S. Если не трудно перечисли список уродцев, чтоб я зря время не тратил на тесты?


Трудно Я пользуюсь довольно ограниченным числом бустовских библиотек, и все они кроме boost::python легкие (умные указатели и тому подобные мелочи), все остальное я достаточно вскольз просматривал и не могу объективно судить уродец это или нет.
Re[6]: BOOST::lexical_cast, .NET short.Parse и производитель
От: Denis2005 Россия  
Дата: 12.11.06 13:01
Оценка: :)
Здравствуйте, FR, Вы писали:

FR>Трудно Я пользуюсь довольно ограниченным числом бустовских библиотек, и все они кроме boost::python легкие (умные указатели и тому подобные мелочи), все остальное я достаточно вскольз просматривал и не могу объективно судить уродец это или нет.


Что-то у меня тоже пока дальше smart_ptr-ов и lambda-ы "дело не пошло".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: BOOST::lexical_cast, .NET short.Parse и производитель
От: Зверёк Харьковский  
Дата: 12.11.06 13:19
Оценка: +1 :)
Здравствуйте, Denis2005, Вы писали:

D>В данном случае (lexical_cast) BOOST.Devel рекомендует делать специализации, использующие strtol и strtod.


ЕМНИМ, lexical_cast по сути своей это "вывод чего угодно в текстовый поток, а потом разбор этого потока". Зная это, уже можно делать предположения о его скорости, и использовать соответствующим образом — если нужно введенную пользователем строчку (одну) конвертнуть правильным образом к любому необходимому типу, то это самый очевидный и безгеморройный вариант (написать надо одну строчку, ее выполнение за 0.01 секунды пользователь не увидит).
А если нужно 10 000 значений (да еще заранее известного формата) преобразовать в другой заранее известный формат — то очевидно, что нужен быстрый специализированный конвертер, написание которого займет некоторое время (большее, чем написать lexcial_cast<int>(str)), и это время будет сэкономлено при выполнении алгоритма.
lexical_cast — это такая специальная штука, которая сознательно жертвует временем выполнения в пользу времени написания.
Чего на зеркало пенять-то?
FAQ — це мiй ай-кью!
Re[2]: [Benchmark] DMD опять быстрее всех. Даже чем atoi :)
От: Андрей Хропов Россия  
Дата: 12.11.06 14:44
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Андрей Хропов, Вы писали:


AVK>Не совсем корректно сравнивать atoi и дотнетный int.Parse, потому что последний понимает разделители и группировки, знаки валют, текущую культуру, NumberFormat.


Читаем в документации к Int32.Parse:

The s parameter contains a number of the form:

[ws][sign]digits[ws]

Items in square brackets ([ and ]) are optional; and the values of the other items are as follows.

ws
An optional white space.

sign
An optional sign.

digits
A sequence of digits ranging from 0 to 9.


Все равно, даже если заменить '0' — '9' и '+' и '-' на произвольные символы это все равно не должно сильно замедлить (поскольку какая разница с чем сравнивать). Ну и могли бы специально оптимизировать для самого частого случая, когда '0'-'9' идут подряд.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: BOOST::lexical_cast, .NET short.Parse и производитель
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.11.06 15:32
Оценка:
Здравствуйте, FR, Вы писали:

FR>Не надо рассматривать boost как монолит, это скорее россыпь почти не связанных библиотек. Большая часть из них весьма полезны и высокопроизводительны, но есть и несколько уродцев.


Мне кажется Denis2005 рассматривает буст не как монолит, а как некий символ.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [Benchmark] DMD опять быстрее всех. Даже чем atoi :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.11.06 16:23
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

АХ>Читаем в документации к Int32.Parse:


Ты не документацию читай, ты рефлектором гляди.
public static int Parse(string s)
{
    return Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo);
}
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[6]: BOOST::lexical_cast, .NET short.Parse и производитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.11.06 16:33
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>lexical_cast — это такая специальная штука, которая сознательно жертвует временем выполнения в пользу времени написания.

ЗХ>Чего на зеркало пенять-то?

Все бы было здорово, если бы отдельные товарищи на основании подобных тестов не делали бы выводы о полной тормознутости .NET/Java.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[7]: BOOST::lexical_cast, .NET short.Parse и производитель
От: Зверёк Харьковский  
Дата: 12.11.06 16:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:

ЗХ>>lexical_cast — это такая специальная штука, которая сознательно жертвует временем выполнения в пользу времени написания.

ЗХ>>Чего на зеркало пенять-то?

AVK>Все бы было здорово, если бы отдельные товарищи на основании подобных тестов не делали бы выводы о полной тормознутости .NET/Java.


А я что? Я ничего
Все равно я пишу на самом-тормозном-языке-из-активно-используемых И как-то получается добиваться приемлемой эффективности.
FAQ — це мiй ай-кью!
Re[5]: BOOST::lexical_cast, .NET short.Parse и производитель
От: FR  
Дата: 12.11.06 20:20
Оценка:
Здравствуйте, VladD2, Вы писали:

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


FR>>Не надо рассматривать boost как монолит, это скорее россыпь почти не связанных библиотек. Большая часть из них весьма полезны и высокопроизводительны, но есть и несколько уродцев.


VD>Мне кажется Denis2005 рассматривает буст не как монолит, а как некий символ.


Да слаба его вера и дух не крепок
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.