пятница, 29 февраля 2008 г.

Сравнение производительность С#,C,C++ часть 3, результаты

В предыдущих сериях:
Разединяем строки...обьединяем строки.
Сравнение производительность С#,C,C++ часть 1, код на C#
Сравнение производительность С#,C,C++ часть 2, код на C++ и на С

Изначально идея была навеяна STL vector performance

Цели которые я перед собой ставил - сравнить производительность кода на чистом С с кодом на С++ с использованием STL/boost при работе со строками на более-менее похожей на реальную задаче. C# я добавил в тесты когда увидел огромную разницу в производительности.

Напомню задачу:
нужно из таких строк: "word1-word2", "word3-word4", "word5-word6"
получить вот такую строку:
word1:word2:word3:word4:word5:word6

Код на С.С++ я компилил в VS 2005, с оптимизацием по скорости в Release версии. Код на С# в VS 2008 Express Edition.

Сводная табличка результатов, отсортированная по скорости.







boost::split, boost::join0.596665 sec
boost::split, boost::join, no std:copy0.492545 sec
simple select_many0.100862 sec
boost::tokenizer0.086117 sec
plain C++0.053814 sec
C#0,041314 sec
plain C0.003925 sec


Выводы - я повременю с уходом в монастырь только потому что код на С все-таки оказался в 10 раз быстрее кода на С#. И в принципе его еще можно немного разогнать.
Хотя код на C# я не оптимизировал, даже скорее наоборот, написал максимально "красиво" с использованием лямбд/генериков не заботясь о скорости. Цели написать быстрый код на C# не было. Когда я переписал с испльзованием StringBuilder разница по скорости с кодом на С сократилась до 4х раз. Уверен его можно еще разогнать.

Что же касается кода на С++ с испльзованием STL+boost - либо я не знаком с каким-то особым способом его использования/оптимизации...либо все очень и очень плохо.

Особенно удручающе выглядит использование Boost String Algorithms Library.

Послесловие - претензии к коду на С++ принимаются только если будет предложено что-то лучшее :). Я старался писать в "идиоматичном" С++, по крайнем мере как я его понимаю. Если кто-то может написать более эффективную реализацию на С++ с использованием std::string, std::vector и прочего std::, а также желательно boost и при этом не скатываясь к варианту на С - буду только рад.
Претензии к реализации тоже не очень принимаются...я и сам вижу что результат будет не правильным например на такой строке "word1--word2" или на такой "word1-word2-" и т.д. Но я решал конкретную задачу а не писал обобщенный способ разбиения строк.
Также я прекрасно вижу что алгоритмы на С++ и C# отличаются от алгоритма на С. Но - и тут я старался написать на "идиоматичном" С, и получилось именно вот так.

Комментариев нет: