Войти
ПрограммированиеФорумОбщее

Как писать высокопроизводительный код? (С++)

Страницы: 1 2 Следующая »
#0
14:17, 21 ноя 2015

Вот программирую уже довольно давно, но всё равно внутри себя ощущаю, что я ничего не умею, что я что-то делаю не так.
Как писать высокопроизводительный код? Как можно выявить узкое место в своей программе?

Пока что я вижу три основные проблемы:
1. Ошибка логики программы в целом (делается что-то лишнее)
2. Излишняя работа с памятью (гонять память туда-сюда не всегда полезно)
3. No cache-friendliness

С 1 пунктом не всё так очевидно, конечно же... Всё зависит от задачи. И я, честно говоря, даже не знаю как можно обнаружить такую ошибку.
Со 2 пунктом не сказал бы, что всё чисто. Для ускорения выделения/освобождения памяти надо писать свой менеджер памяти. Ну ок, написал пул объектов... Теперь хочу, чтобы STL неявно работал с ним - а вот фигушки, всё через костыли... Да и дублирование менеджеров под разные типы - тоже не хорошо..
С 3 пунктом в случае однопоточного приложения всё понятно: нужно данные держать как можно ближе друг к другу (т.е. хранить в std::vector, ну или в deque).

Если речь зайдет уже о многопоточности, то я вообще теряюсь: как можно заставить "красиво" работать менеджер памяти?

TDD предполагает что я буду писать кучу юнит-тестов... Но TDD, получается, не сохранит меня от нужды написания лишнего кода?

Так КАК ЖЕ писать высокопроизводительный код? Есть какие-то советы, хаки?

#1
14:34, 21 ноя 2015

И кстати: возможно ли заюзать CRTP так, чтобы все потомки базового класса лежали в одном массиве? Именно лежали рядышком (речь о статическом полиморфизме)

#2
16:55, 21 ноя 2015

Laynos
>Как можно выявить узкое место в своей программе?
https://ru.wikipedia.org/wiki/Профилирование_(информатика)

#3
19:53, 21 ноя 2015

по-моему, тебе надо просто больше писать кода, чем постов на форуме, и всё постепенно придёт

#4
14:53, 22 ноя 2015

Первые две проблемы не имеют решения. Их можно решить "административно", "архитектурно", но не "тупо кодом".
Третья проблема не проблема, а часик посидеть в VTune шлифуя счетное количество мест, которые сильно выпирают. И такой подход требует где-то 0.000001% программы.

#5
15:11, 22 ноя 2015

Suslik
> по-моему, тебе надо просто больше писать кода, чем постов на форуме, и всё
> постепенно придёт

+1K

#6
16:21, 22 ноя 2015

Какой менеджер памяти, какой stl?

Конспектируй:

1. Никаких выделений памяти (на стеке по возможности тоже)
2. Никакого стл
3. Минимум (желательно 0) ветвлений
4. Массовая группировка данных и структурная их обработка
5. Никакого полиморфизма

#7
16:36, 22 ноя 2015

Laynos
> С 1 пунктом даже не знаю как можно обнаружить такую ошибку
тривиально, берёшь, выкидываешь код, если всё продолжает работать как надо, значит был лишний, если нет, переписываешь, должно получиться меньше кода, повторить : )

#8
17:38, 22 ноя 2015

Laynos
Грустный опыт показывает, что тормозит чаще всего количество. В случае рендеринга - пикселей на экране, в случае физики - коллайдеров.
Вот уперлось все в скорость работы пиксельных шейдеров и скорость памяти - и все, хоть ты тресни.

#9
23:37, 22 ноя 2015

Kashey
> И такой подход требует где-то 0.000001% программы.
Ну, вообще-то, 80/20

#10
3:59, 23 ноя 2015

Laynos
> Как писать высокопроизводительный код?
Зачем это? Так никто не делает.

#11
7:46, 23 ноя 2015

Laynos
> Как писать высокопроизводительный код? Как можно выявить узкое место в своей
> программе?
Писать руками, выявлять опытом и соответствующими инструментами.

Laynos
> И я, честно говоря, даже не знаю как можно обнаружить такую ошибку.
Ну т.е. сравнить требования к ПО с реальным состоянием не?

Laynos
> Для ускорения выделения/освобождения памяти надо писать свой менеджер памяти.
Для начала неплохо убрать копирование и использование кучи оттуда где оно ненужно.

Laynos
> Если речь зайдет уже о многопоточности, то я вообще теряюсь: как можно
> заставить "красиво" работать менеджер памяти?
причем тут манагер памяти и кэш? не пересекай данные в потоках.

Laynos
> TDD предполагает что я буду писать кучу юнит-тестов...
И как это связанно с высокопроизводительным кодом?

Laynos
> не сохранит меня от нужды написания лишнего кода?
крометого на практике в критических местах приходится писать несколько реализаций и смотреть какая из них в данном случае дает профит.

#12
9:18, 23 ноя 2015

-Eugene-
> Вот уперлось все в скорость работы пиксельных шейдеров и скорость памяти - и
> все, хоть ты тресни.

Ну так можно уменьшить число пикселей путём оптимизаций?

#13
9:31, 23 ноя 2015

innuendo
Можно. Но не всегда это возможно и почти никогда - просто.
Самый тупой пример - дым в контре. На древнем ноуте одного знакомого все начинало дико тормозить из-за высокого овердроу, когда заходишь в дым.
Ну или более новый пример. Мод Lost Alpha на сталкере. Там есть загазованный дом. Та же самая ситуация, только уже на моем почти-игровом ноуте.
И как это оптимизировать, кроме как отключить нафиг? А если нет прямого доступа к коду?

#14
9:47, 23 ноя 2015

-Eugene-
> На древнем ноуте одного знакомого все начинало дико тормозить из-за высокого
> овердроу, когда заходишь в дым.

Не только на буках, но и старных десктопах.

> И как это оптимизировать, кроме как отключить нафиг?

Поиграться с альфатестом ?

Или это VolumeFog ?

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.