| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Религиозные войны > C++ - производительность |
| Автор: archimed7592 25.1.2008, 19:40 |
| Сишники, кто хочет бенчмарк? Давайте поставим задачу и сравним реализации на С и С++ по скорости. |
| Автор: MAKCim 25.1.2008, 19:49 |
| archimed7592, давай в качестве компиляторов предлагаю G++ и GCC осталось только задачу придумать |
| Автор: JackYF 25.1.2008, 20:07 |
полностью поддерживаю это самое сложное проблема в том, что в С++-ом коде можно написать почти все те же конструкции, что и в С-шном. Тогда будет сравнение компиляторов |
| Автор: Void 25.1.2008, 21:47 | ||
А чего не http://forum.sources.ru/index.php?showtopic=207483? По поводу задачи с сортировкой по категориям: как будут версии на Си и C++, сравним с этим, у меня есть подозрение, что как минимум не сортирующий вариант будет не медленнее
|
| Автор: archimed7592 25.1.2008, 22:16 |
Это будет несправедливо по отношению к Сишникам, но я не против Дык возьми оттуда любую плюсовую версию и проверь |
| Автор: Void 25.1.2008, 22:20 |
Мне лень регистрироваться на форуме только ради того, чтобы скачать пару аттачей (никогда, кстати, не понимал этой политики не показывать аттачи гостям). Я лучше подожду родных винградовских решений |
| Автор: MAKCim 25.1.2008, 22:38 | ||
с чего это? настоящие сишники трудностей не боятся |
| Автор: archimed7592 26.1.2008, 10:20 |
А ты настоящий? |
| Автор: MAKCim 26.1.2008, 11:19 |
настоящие недолюливают С++ так что я наполовину настоящий |
| Автор: archimed7592 26.1.2008, 11:33 |
| Ну так чё? Fight? Или не fight? Т.к. тестировать собираемся скорость, лучше, на мой взгляд, первая задача... угу? Добавлено через 21 секунду Или своё чё-нибудь предложишь? |
| Автор: Alexeis 26.1.2008, 12:16 |
Давайте возьмем текстовый текстовый файл на 1Мб и удалим из него все слова длинее длинее 6 символов. |
| Автор: chipset 26.1.2008, 12:21 |
| Востребован в: - Настольных прилагах для широкого круга пользователей: важна скорость и отточеность, также поддержка старых ОС (95-98). - Серьёзных вычисляниях (кластеры солярис к примеру). - Кросс-платформенные прилаги (не надо гнать про Моно, пожалуйста). - Движках: БД, ОС, игры, всякого рода ЕРП (не прикладуха), итд. |
| Автор: archimed7592 26.1.2008, 12:26 | ||
Вот, с чем не поспоришь - с тем не поспоришь Ты как считаешь, в Google достаточно серьёзные вычисления бегают? Там про С++ не слышали... Ну, точнее, слышали, но для обработки своих задач его не используют. |
| Автор: JackYF 26.1.2008, 13:19 |
*поперхнулся* ... это вообще как? кто сказал? |
| Автор: archimed7592 26.1.2008, 13:31 |
Очень просто Сами ходят по ВУЗам и рассказывают |
| Автор: Alexeis 26.1.2008, 13:43 | ||
Ну хорошо, можно тогда еще добавить дублирование слов. Не хочеться особо сложной задачи, чтобы не лень было реализовывать Значит формулировка такая. --------------------------------------------------------------------------------------------- Из предложенного текста удалить все слова длинее 6 символов (только слова пробелы не трогать), все слова длиной в 3 символа продублировать 7 раз. --------------------------------------------------------------------------------------------- пример : "Гостиная Анны Павловны начала понемногу наполняться." -> " Анны начала " "война и мир" -> "война и мирмирмирмирмирмирмир" --------------------------------------------------------------------------------------------- текстовый файлик http://alexei-s1.narod.ru/books/tolstoi_l_n__voina_i_mir2.7z |
| Автор: archimed7592 26.1.2008, 13:47 |
| Добавлю к этому, что нужно считывать не из файла, а из потока стандартного ввода, а результат выводить в поток стандартного вывода, причём без каких-либо приблуд(помимо результата). |
| Автор: JackYF 26.1.2008, 13:54 | ||
и что у них вместо С/С++? Python не катит. |
| Автор: archimed7592 26.1.2008, 14:04 |
Если я поднатужусь и вспомню название, боюсь, что тебе оно ни о чём не скажет, ибо это их внутрений язык. Лучше потрать полчаса на то чтобы скачать лекции и ещё немного, чтобы прослушать их - много интересного узнаешь ;). Начни отсюда: http://youtube.com/watch?v=uwa7tRAUlPQ |
| Автор: Alexeis 26.1.2008, 14:11 | ||
А я и не говорил, что читать нужно из файла, не важно каков первоначальный источник, хоть ресурс, хоть сегмент данных. Время засекаем после того как получили готовый буфер в ОЗУ. |
| Автор: MAKCim 26.1.2008, 15:44 |
| archimed7592, давай лучше задачу про категории |
| Автор: archimed7592 26.1.2008, 15:51 | ||
Вот не надо этих "хоть" Т.о. можно будет написать тестер, который будет на автомате прогонять тысячу тестов для 3-5 решений. Нет, время засекается с момента старта приложения и до момента его завершения. Для того чтобы исключить разные издержки тест прогоняется 101 раз и берётся среднее от последних 100 запусков, причём делается это всё внешней утилитой. Ну давай Могу я поинтересоваться, чем тебя эта задача смутила? |
| Автор: Alexeis 26.1.2008, 16:01 | ||
Давайте еще время отсчитывать от старта операционки |
| Автор: MAKCim 26.1.2008, 16:31 |
лень слишком много работы со строками |
| Автор: archimed7592 26.1.2008, 16:34 |
| Хорошо, наполовину настоящий Сишник, давай. Задача там вроде чётко поставлена |
| Автор: JackYF 26.1.2008, 16:51 |
а мы сравниваем программы, а не алгоритмы, не так ли? |
| Автор: Alexeis 26.1.2008, 17:03 |
Ну это уж кто как хочет. Меня интересует в как быстро сработает алгоритм и вернет, результат, а не как быстро загрузиться и проинициализируется программа, перед выполнением нужных мне действий. Хотя в задаче про строки время работы алгоритма будет исчисляется десятками секунд, потому погрешность будет невелика. Но вот если разница будет 2-5%, то достоверность таких опытов будет нулевая. |
| Автор: MAKCim 26.1.2008, 18:43 | ||
названия категорий high, middle и low хотя это только на вывод влияет |
| Автор: Void 26.1.2008, 18:55 | ||||||
MAKCim, погоди, кто сказал, что имена категорий фиксированы? Из
Мы должны получить
, но никак не
Боюсь, низачот |
| Автор: MAKCim 26.1.2008, 19:00 |
где написано обратное? цифры тоже могут отсутствовать? если надо, могу исправить |
| Автор: Void 26.1.2008, 19:11 |
ТЗ чертовски неформальное. Теперь понял логику, но, признаться, мне бы в жизни не пришло в голову так его интерпретировать |
| Автор: MAKCim 26.1.2008, 19:12 | ||
а что, я как-то по-особенному проитерпретировал? |
| Автор: Void 26.1.2008, 19:21 |
Ты принял, что названия категорий, подкатегорий и имена элементов — не произвольные строки, а имеют вид "%s%d", где первая часть фиксирована для всех элементов. Я лично для себя сразу решил, что названия вида «Категория1;Подкатегория1;Элемент1» использовались только как пример, чтобы не утруждать себя придумыванием разнообразных строк. |
| Автор: MAKCim 26.1.2008, 19:45 | ||
| Void, вообщем надо уточнить, что имелось в виду сейчас у меня программа работает очень быстро http://falaleev.at.tut.by/data.rar тестовый пример
C2D, 1.86Ghz, Linux (2.6.18, x86-64) |
| Автор: archimed7592 26.1.2008, 19:50 |
| MAKCim, естественно, что все строки во входе произвольные |
| Автор: Void 26.1.2008, 19:54 |
| Пусть archimed7592 прояснит ситуацию, он засветился в оригинальном топике С произвольными строками по любому интереснее. |
| Автор: MAKCim 26.1.2008, 19:55 |
сгенерируй правильный входной файл и выходной так будет проще писАть |
| Автор: chipset 26.1.2008, 21:10 | ||
Ты неправ. Гугл ето ВСЕ С++. Кроме ГУИ. |
| Автор: archimed7592 26.1.2008, 21:13 |
Чипс, откуда дровишки? |
| Автор: archimed7592 26.1.2008, 21:34 |
Ишь ты хитрый какой |
| Автор: MAKCim 26.1.2008, 22:23 | ||
| блин, за...лся писать вот
разделитель определен через #define как DELIMITER Добавлено @ 22:28 archimed7592, тест давай Добавлено @ 22:32 сортировка пузырьковая было влом QuickSort писать, а стандартный qsort() со списками не работает |
| Автор: chipset 26.1.2008, 22:42 |
Ну а что там по твоему? Си шарп? ЫЫЫ, может Java? )))) |
| Автор: MAKCim 26.1.2008, 23:10 | ||||
| блин, пока вас дождешься вот генератор
http://falaleev.at.tut.by/data.rar тестовый пример вот результаты на моей системе
|
| Автор: archimed7592 26.1.2008, 23:11 |
| Чипс, мой тебе совет: прослушай ту лекцию, на которую я давал ссылку, чтобы беседа получалась хоть немного конструктивной... Угу? Они используют некоторый ф-циональный язык, который они написали сами. |
| Автор: MAKCim 26.1.2008, 23:29 |
| archimed7592, где вариант на С++? |
| Автор: archimed7592 26.1.2008, 23:38 |
| chipset, вот, можешь почитать Алёнкин конспект: http://alenacpp.blogspot.com/2007/02/blog-post_20.html . Макс, ой, не сегодня... Не до этого, к сожалению. Может быть завтра руки дойдут. |
| Автор: maxim1000 27.1.2008, 01:14 | ||
вот небольшой набросок со стороны С++:
с сортировкой некрасиво получилось (копирование вектора), но на скорую руку, наверное, и так пойдёт да и расширяемость не очень будет, если количество категорий будет другое или переменное сравнивать, наверное, лучше на той же машине и системе, что и представленный C-шный вариант |
| Автор: Любитель 27.1.2008, 01:53 | ||
Чего-то я в итоге не понял - вы решили тестить реализацию на си и реализацию на C++ "без использования фич C++" Добавлено через 5 минут и 32 секунды Банально - сет или мультисет (в зависимости от условий задачи - лень особо читать :/ ) вместо вектора. |
| Автор: maxim1000 27.1.2008, 10:42 | ||||
про set думал, но не хотелось объединять одинаковые значения в вот про multiset как-то не подумал... исправленный вариант:
|
| Автор: Void 27.1.2008, 11:44 | ||||||
| MAKCim, быть может я чего-то не понимаю, но твоя программа ТЗ не соответствует. Даю на вход:
Получаю на выходе:
Во-первых, категории надо объединять, во-вторых, кто зохавал четвёртый элемент? Кроме того, если DELIMITER заменить на точку с запятой и соответственно изменить приведённые строки, то получится другой результат, но опять неправильный. Вот альтернативный скрипт генерации исходных данных, с немного более реальными характеристиками:
|
| Автор: MAKCim 27.1.2008, 11:44 | ||||||||
| господа либо баг у меня, либо в libc -> fgets() вот часть кода рушится с SIGSEGV на 927 итерации факт в том, что на этой итерации fgets() не возвращает NULL (якобы строка прочитана) но при работе с pointer идет SIGSEGV я исхожу из того, что fgets() должна записать в выходной буфер в конце \n и \0 (во всяком случае так в мане написано) что не так? вполне возможно, что не прав я, но не пойму где
Добавлено через 4 минуты и 55 секунд
еще раз исходник скомпилируй
измени DELIMITER в исходном коде Добавлено через 8 минут и 8 секунд Void, у меня на выходе
|
| Автор: Void 27.1.2008, 11:58 | ||
Я это и делал. |
| Автор: MAKCim 27.1.2008, 12:34 | ||
| Void, вот код
на твой пример он выводит правильные результаты |
| Автор: Void 27.1.2008, 12:43 | ||
MAKCim, всё, понял. Проблема в gcc. С -O2 у меня результат неверный, с -O0 всё нормально.
Мда. |
| Автор: MAKCim 27.1.2008, 12:51 | ||
O_O что за х.... |
| Автор: archimed7592 27.1.2008, 14:28 |
Оу, ребят, можете считать, что тройка cat;subcat;entry уникальна и, если она встречается дважды(или большее кол-во раз), то выводить её нужно единожды. |
| Автор: maxim1000 27.1.2008, 22:36 | ||||
ну тогда так
|
| Автор: mr.DUDA 29.1.2008, 10:42 |
| Эммм.. а когда будут результаты бенчмарков ? |
| Автор: archimed7592 4.2.2008, 00:01 |
| maxim1000, в таком случае у тебя сортировка при любом раскладе отрабатывает... Т.е. в тестах без сортировки твой вариант теоретически "сольёт"... Когда появится время, чтобы затестить решения(ещё бы найти время, чтобы своё решение навоять)... |
| Автор: maxim1000 4.2.2008, 11:26 | ||
про какую сортировку речь? если я не ошибаюсь, сортировка нужна на всех этапах для быстрого поиска - ведь перед добавлением очередного элемента на любой уровень нужно найти его, если он вдруг уже есть |
| Автор: MAKCim 4.2.2008, 14:17 | ||
archimed7592,
ты это затеял так что уж изволь |
| Автор: archimed7592 5.2.2008, 01:42 | ||||
Эмм, Макс, это не совсем Си Добавлено через 5 минут и 25 секунд Каюсь, каюсь, время было, но было жутко лень Вот мой вариант:
Сча попытаюсь отрефакторить Максовский код, чтобы он компилился как Сишный и, соответственно, затестить. |
| Автор: archimed7592 5.2.2008, 02:04 | ||
Вот подправленный вариант Макса из http://forum.vingrad.ru/index.php?showtopic=193332&view=findpost&p=1393606 поста:
На входных данных, сгенерённых скриптом из http://forum.vingrad.ru/index.php?showtopic=193332&view=findpost&p=1393575 поста - AV на 121 строке... |
| Автор: archimed7592 5.2.2008, 02:34 |
| Моё vs http://forum.vingrad.ru/index.php?showtopic=193332&view=findpost&p=1394052 maxim1000. Замечу, что у maxim1000 нет разницы между необходимостью сортировки и её отсутствием, потому у него результаты одинаковые. archimed7592/nosort | archimed7592/sort | maxim1000/nosort | maxim1000/sort data #1 1890 | 1703 | 2031 | 2031 data #2 2390 | 2203 | 2531 | 2531 Как можно заметить, толку от моей попытки соптимизировать ненадобность сортировки не вышло, точнее получился антитолк Хотя, если тэстить на том файлике в котором будет много категорий/подкатегорий/элементов, у которых начало будет одинаковым(отличие только в конце строки - к примеру, порядковый номер), то, думаю, толк от хэширования выйдет. |
| Автор: maxim1000 5.2.2008, 09:41 |
| да... про хеш надо было мне подумать |
| Автор: MAKCim 5.2.2008, 10:12 | ||
что здесь не С? Добавлено через 1 минуту и 37 секунд а boost-ом разве можно пользоваться? по-моему, только стандартная библиотека а то я тоже могу какую-нибудь библиотеку скачать Добавлено через 6 минут и 15 секунд
я в курсе у меня на 927 грешу на реализацию fgets потому как на соответствующей итерации она возвращает хз какую строку Добавлено через 7 минут и 45 секунд archimed7592, ты файлик мой сишным компилятором компилил? test2.cpp меня смущает |
| Автор: archimed7592 5.2.2008, 10:23 |
В Си можно объявлять/определять сущности только после открывающейся фигурной скобки. Вроде как... Макс, я тебя умоляю. foreach и call_traits я могу убрать, а hash и mpl::if реализовать "на месте" Ну это там была только стандартная, ибо у Дельфистов один аргумент: "вы без буста - ничто". У нас же задача не доказать друг другу, что один язык круче другого(и так очевидно, что Си - подмножество С++), а сравнить скорость, потому я предположил, что бустом воспользоваться можно С другой стороны, если следовать букве задания, то нельзя использовать NTBS Я не против, только, чтобы простота установки была сравнима с бустом: скачал, поместил в include-paths и радуешься |
| Автор: MAKCim 5.2.2008, 10:34 | ||||
я такого правила не знаю хотя может я не прав тыкните носом в стандарт
C и NTBS понятия неразделимые Добавлено через 2 минуты и 52 секунды ты какой компиялтор для моего кода использовал? судя по всему VS, и к тому же не С, да? |
| Автор: archimed7592 5.2.2008, 10:47 |
Угу. Это коммент автосгенерённый. Потом я его переименовал. Откуда думаешь я тебе на "не совсем Си" выдумал? Компилятор ругался Ты чего? Ладно, если бы это была одна реализация(glibc) - дык это уже MSVC и, скорее, нужно грешить не на библиотеку ;). Минуточку... |
| Автор: archimed7592 5.2.2008, 11:20 |
В общем, в С99 уже можно(насколько я понял), но MSVC-2005 об этом не в курсе |
| Автор: MAKCim 5.2.2008, 11:41 | ||||||
да, 5 баллов тому, кто найдет ошибку я уже нашел Добавлено через 2 минуты и 17 секунд
чего-то я непонял но у меня
замечательно компилируется без скобок ANSI это никак не C99 |
| Автор: archimed7592 5.2.2008, 11:54 |
Ты Сишник - тебе виднее Ага, нам не забудь показать |
| Автор: Void 5.2.2008, 16:20 |
| archimed7592, мне лень (и почти нет места на диске |
| Автор: Mayk 5.2.2008, 17:09 |
-pedantic добавь. получишь что-то типа a.c:7: warning: ISO C90 forbids mixed declarations and code |
| Автор: Mayk 5.2.2008, 18:54 | ||||
Ещё одна си-шная реализация против реализации maxim1000 ( по сравнению с Архимедом в ней букв мало, в варианте MAKcimа sigsegv ).
а теперь цифры(порежу всё что не real)
Итого. Вариант maxim1000 рулит. Во всех остальных букв много. В топку. с сортировкой сишный вариант ухудшается до 0.0056-0.0080[квотить не буду, лень] секунд. PS. заменил в maxim1000'вском варианте map'ы на unordered_map'ы. результаты ухудшились до ~0.0014. |
| Автор: Void 5.2.2008, 19:12 |
| Mayk, входных данных побольше бы надо, миллисекунды опасно приближаются к пределам статистической погрешности. По хорошему, всегда надо делать серию и давать не только среднее, но и стандартное отклонение. Zed Shaw по этому поводу http://www.zedshaw.com/rants/programmer_stats.html. |
| Автор: Mayk 5.2.2008, 19:18 | ||
Когда речь идёт о 0.0021 против 0.0009 в течение нескольких запусков --- не думаю что погрешности здесь исказят лидера. А ждать пока они отработают на миллион записей мне лень. 1000 записей весьма большая n. К тому же при увеличении n мой сишный код начнёт ещё больше тормозить из-за квардатичнго построение строк через string_to_hash'а (кстати, привет profiler). Переписывать во что-то более быстрое не получится не раздувая код(раздувать код -- лень). Сишный по компактности с STL'ным точно не сравнится. вообщем моё имхо --- фффтопку Варианты с >100 строками. |
| Автор: Любитель 5.2.2008, 19:34 |
+1 |
| Автор: Void 5.2.2008, 21:21 | ||
| В Boost 1.33, который в пакетах, нет foreach, поэтому вариант с бустом по совету Mayk пошёл в топку. Поскольку решили, что выруливает вариант maxim1000, буду сравнивать с ним. GCC 4.1.2, Python 2.5.1, Athlon 64 3200+ Из флагов gcc только -O2. Входной файл на 100 тыс. элементов, ~2,5 Мб. Вывод в /dev/null. Серии по 12 запусков, первый не учитывается. C++ (STL): mean = 0.93, stddev = 0.04 Python: mean = 0.92, stddev = 0.09 Python (sort): mean = 1.11, stddev = 0.02 Итак, мой прогноз оправдался в точности:
Если в варианте C++ использовать unordered_map/hash_map, вероятно, будет прибавка в скорости, но вряд ли более чем двукратная. Та-ак, на чём бы ещё написать этот тестик |
| Автор: MAKCim 5.2.2008, 22:39 | ||
| Mayk, сортировочку у тебя можно в qsort() запихнуть будет быстрее в add_entry() вызывать постоянно malloc()...не слишком быстро Добавлено через 12 минут и 38 секунд вот мой исправленный вариант
|
| Автор: Mayk 6.2.2008, 07:23 | ||
Про сортировку соглашусь. Самое смешное что в начале так и было, но я зачем-то убрал А на add_entry профайлер не советует обращать вниманин. По идее нужно string_to_hash чем-то нормальным заменить. Ибо n раз линейный поиск отстой ещё тот. |