Многие из тех, кто хотят, чтобы их программа выполнялась без задержек, начинают заниматься тем, что изначально не имеет смысла.
Вообще, когда становится необходима оптимизация ( если она всё таки действительно необходима),следует снижать О-сложность алгоритма, а не заниматься микрооптимизациями типа экономии на одном сложении.Так же учтём что рост данных почти непредсказуем, неограничен и может просто положить вашу программу на лопатки.
1. Гибкие динамически распределяемые данные лучше, чем массивы фиксированного размера. - Массив больший, чем наибольший массив, который мне когда-либо потребуется, приводит к ошибкам.
- Массивы можно использовать только когда размеры данных фиксированы и известные во время компиляции.
2. Сложность используемого алгоритма должна быть точно известна. - Линейный алгоритм, вызывающий другую линейную операцию, делает алгоритм квадратичным.
3. По возможности использовать линейные и более быстрые алгоритмы.- Идеальные алгоритмы с константной сложностью, такие как push_back или поиск в хэш-таблице
- Неплохи алгоритмы со сложностью О(log N), такие как операции с контейнерами set/map и lower_lound или upper_lound с итераторами произвольного доступа.
- Допустима линейная сложность O(N), как, например, у vector::insert или for_each.
4. Избегать применения алгоритмов с более чем линейной сложностью где это возможно.- Следует заменить алгоритм со сложностью O(N*log N) или O(N^2) (если возможно) чтобы избежать непропорционального падения производительности при существенном росте объёма данных.
5. Никогда не используйте экспоненциальные алгоритмы, потому что почти всегда должен быть способ лучше!
|