LINUX.ORG.RU

Почему программы на с++ тормозят :)

 ,


1

3

https://www.computerenhance.com/p/welcome-to-the-performance-aware

ах, наконец-то кто-то заметил слона в посудной лавке :-)

Видео, 22 минуты https://m.youtube.com/watch?v=tD5NrevFtbU

Заменяем крутой полиморфизм на тупой свитч - получаем 1.5 ускорения :) Я так понял конечно тут еще компилятор виновен, может ему можно как-то явно указать кто и куда морфирует в данной программе .. но результат пока (под вин, судя по notepad++ и оформлению окон) явно не в пользу красивого программирования.

В тред приглашаются программисты со своими (анти)примерами :)

едит: исправил ссылку на видео

★★★★★

Последнее исправление: Andrew-R (всего исправлений: 1)

Да это всё херня. Я как-то раз в одном впопенсорцном проекте заменил список на сортированный массив и получил ускорение в 200 раз, потому что там поиск по этому списку был буквально на каждое событие, и при этом список почти не менялся.

hateyoufeel ★★★★★
()

Заменяем крутой полиморфизм на тупой свитч - получаем 1.5 ускорения :)

Ну если в примере ничего, кроме свитча/полиморфизма нет, охотно поверю про 1,5 (чего, кстати, полтора? Раза?) А если там есть какая-никакая логика, всё это сразу превратится в экономию на спичках.

И да, это не эксклюзивная особенность C++, в больших проектах на классическом Си не так уж редко делают тот же полиморфизм, руками создавая структуры с указателями на коллбэки. Хотя могли бы и баобабы свитчей выращивать. Не от хорошей жизни, видать. :)

P.S. И разумеется, бывают критичные участки кода, где если нужда припрёт, и свитчей понаставишь, и все операции выделения/освобождения памяти вынесешь в другое место, и не только их. Там — вопросов нет. Но это, как правило, совершенно отдельные проценты кода и не на всех задачах. Преждевременной оптимизацией увлекаться не стоит.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 3)

Заменяем крутой полиморфизм на тупой свитч - получаем 1.5 ускорения :)

JVM (да многие другие JIT-ы) умеет специализировать в runtime, поэтому Java может работать быстрее процессора. (Только почему-то всё равно жутко тормозит)

явно не в пользу красивого программирования.

«Высокоуровневые» конструкции (языки) тормознее, чем специализированный код (на ассемблере), вот это новость!

utf8nowhere ★★★
()

я правильно понял что все упирается в проблемы:

  • люди не бенчмаркают и ничего не сравнивают
  • люди слабо понимают что как и во что компилится
  • люди слабы в алгоритмах и структурах данных

а так да, плюсы или нет, это без разницы

umren ★★★★★
()
Последнее исправление: umren (всего исправлений: 1)
Ответ на: комментарий от hobbit

И разумеется, бывают критичные участки кода, где если нужда припрёт, и свитчей понаставишь, и все операции выделения/освобождения памяти вынесешь в другое место, и не только их.

Вообще-то performance matters. Поэтому и пытаются в вумные оптимизации, чтобы писать можно было красиво, а исполнялось быстро.

luke ★★★★★
()
Ответ на: комментарий от fsb4000

Бггг.
«Здравствуйте, вот таким несложным способом можно ускорить программу в 20 раз» - «ДА ТЫ ПРОСТО ДУРАЧОК ИЛИ ПРОВОКАТОР».
Офигенно.
Да любой чувак, который на фоне миллиарда говношлепов с их «не нужно преждевременной оптимизации» и «подумаешь, 20% потерь» публично ставит вопрос производительности - святой, ему памятник надо поставить и жертвы приносить.

thesis ★★★★★
()

Почему программы на с++ тормозят :)

Вопрос и не сложный.

В inet много API для нахождения простых чисел.
Даже соревнования разные были.
При получении небольшого их количества все алгоритмы «хорошие».

Ныне разрабатывают API весьма не оптимизированное.
На небольших объемах данных все ok.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Да я ж ламер, но я вообще не верю, что виртуальные функции тормозят всё аж в полтора раза даже без оптимизаций. А проверять, да еще с разными опциями оптимизации, мне уже лень.

Однако насчет памятника и жертвоприношений мое мнение остается прежним.

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 1)
Ответ на: комментарий от hobbit

И да, это не эксклюзивная особенность C++, в больших проектах на классическом Си не так уж редко делают тот же полиморфизм, руками создавая структуры с указателями на коллбэки. Хотя могли бы и баобабы свитчей выращивать. Не от хорошей жизни, видать. :)

Ниже ещё не прочитал, может сбаяню, но: выбор строго зависит от конкретной задачи, и лучше всего (из того что мне попадалось) это было сформулировано в книжке «modern compiler implementation»: там где у вас фиксированный конечный набор типов (AST-узлы) и произвольный расширяемый набор операций над ними – полиморфизм нужен внешний (switch); а где наоборот фиксированный набор операций над расширяемой иерархией – наследование (операции становятся виртуальными методами).

dimgel ★★★★★
()
Ответ на: комментарий от AlexVR

Ну а в ржавом для этого есть enum_dispatch.

А я помнится, когда писал кодогенераторы на плюсях, очень любил массив из labels и косвенный goto по ним. Это gccявое расширение, хотя и в шланге ЕМНИП есть.

dimgel ★★★★★
()
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от thesis

Да любой чувак, который на фоне миллиарда говношлепов с их «не нужно преждевременной оптимизации» и «подумаешь, 20% потерь» публично ставит вопрос производительности - святой, ему памятник надо поставить и жертвы приносить.

Ну и где б@#$ь мой памятник? Ладно, х@# с ним с памятником, его не сдвинешь-не продашь. Жертвы где?!

dimgel ★★★★★
()
Ответ на: комментарий от thesis

после всех этих электронов, не к ночи будь помянуты, выкатывать претензии к крестовым разработчикам на тему что они что-то там не оптимально запилили?

это как жрать бутер типа «торт с салом» и рассуждать о том что жопу разнесло из-за лишней помидорки во вчерашнем салате.

ну давайте без помидорки, чо. должно помочь.

olelookoe ★★★
()
Ответ на: комментарий от hateyoufeel

Это херня у тебя была. Я однажды ускорил генерацию рапорта с 50 минут до меньше секунды. Переписал просто с RoR на Java и убрал дерганье базы в лупе. Потом узнал, что с прошлый программистом «не договорились» по деньгам и он ушел. А потом узнал, что шэф кидает всех на бонусы, но это уже другая история.

untitl3d
()
Ответ на: комментарий от thesis

Вот именно блин. Тут только заикнешься, что вебня тормозит, так сразу набегает специалистов со своими «рыночек выбрал, общество решило, меньше трудозатрат = лучше всегда и во всем» и т.п.

rumgot ★★★★★
()
Ответ на: комментарий от utf8nowhere

Пацаны, я нового ньюфага поймал!

Пятизвёздочного причём! =) Я только собрался было тоже в ньюфагстве покаяться, но успел обратить внимание. :)

dimgel ★★★★★
()
Ответ на: комментарий от rumgot

Тане, просто вышел в эрзент-стайл — «забыл» исправить несколько багов, из-за которых вся система равна нулю и уволился. Пусть нанимают, обучают, дебажат теперь на эти бонусы :)

untitl3d
()
Последнее исправление: untitl3d (всего исправлений: 1)
Ответ на: комментарий от untitl3d

ускорил генерацию рапорта с 50 минут до меньше секунды

Ну вот. Было критическое высоконагруженное приложение, а стал какой-то мелкий костыль((

thesis ★★★★★
()

Схожая тема Объясните сишную магию v2

Для Ъ:

int fLastMoveToIndex = 5; // любое число
fLastMoveToIndex ^= ~fLastMoveToIndex >> (8 * >sizeof(fLastMoveToIndex) - 1);

Экспериментально удалось выяснить, что данный код меняет знак и отнимает 1 только если число положительное. Как он это делает - я даже знать не хочу.
Вопрос: что мешало написать банальный if, или хотя бы оставить комментарий? Типичное сишное какерство?
PS: производительно данного куска кода на погоду не влияет.

Вот с этим я не соглашусь. Я не уверен что компиляторы достаточно умные чтоб развернуть if в парочку дешевых логических операций, а не в условный переход.

mydibyje ★★★
()
Последнее исправление: mydibyje (всего исправлений: 1)

Shame to you за отсутствие выдержки для Ъ. Он там виртуальный вызов свитчем заменил что-ли? Это сто раз уже промеряли и обсосали ещё лет 15 назад. 1.5 раза там может быть только из-за сопутствующего инлайна, у более крупных операций оверхед неявного вызова измеряется единицами процентов на современных CPU.

Мораль тут только в том, что знать как работают кишки лучше, чем не знать. Что и так понятно.

Вместо траты кучи времени на ютуб и платные подписки рекомендую пролистать олдскульный текст без картинок в pdf: https://www.agner.org/optimize/optimizing_cpp.pdf . Тут собрано много best practice подобного рода в компактном для усвоения виде.

snizovtsev ★★★★★
()
Последнее исправление: snizovtsev (всего исправлений: 2)
Ответ на: комментарий от DumLemming

Ну ладно тебе, не обижай товарищей. Ну невозможно писать приложения со сложной логикой/интерфейсом со всевозможными свистоперделками на убер оверхедной платформе и чтобы ничего не тормозило.

rumgot ★★★★★
()