История изменений
Исправление snizovtsev, (текущая версия) :
STL неплох для «набросать рабочий прототип за день». Для остального обычно его не хватает или не оптимален. В итоге часто финальному оптимизированному коду хватает фич на уровне C.
Например, недавно решил вспомнить молодость и порешать олимпиадную задачку на графы. Но писать код максимально оптимально, как будто в продакшн.
В итоге лапша вроде std::vector<std::vector<u32>> adj;
превращается в 2 вектора с объединёнными списками и оффсетами к ним. И всё, конец безопасности. А иначе жрёт память и страдает кеш промахами. Далее нужно было пометить 2 ребра для каждой вершины после обхода дерева. И тут оказалось, что дешевле swap-ать элементы в начало списка, а не хранить отдельно дополнительные индексы – полетел const
метода. И тд, включая написание рекурсии руками, чтобы не зависеть от размера стека, не тратить место на frame pointers и иметь возможность заглянуть «на n уровней выше по стеку».
Короче, синтаксический сахар часто мешает писать хороший код, а не помогает.
Исправление snizovtsev, :
STL неплох для «набросать рабочий прототип за день». Для остального обычно его не хватает или не оптимален. В итоге часто финальному оптимизированному коду хватает фич на уровне C.
Например, недавно решил вспомнить молодость и порешать олимпиадную задачку на графы. Но писать код максимально оптимально, как будто в продакшн.
В итоге лапша вроде std::vector<std::vector<u32>> adj;
превращается в 2 вектора с объединёнными списками и оффсетами к ним. И всё, конец безопасности. А иначе жрёт память и страдает кеш промахами. Далее нужно было пометить 2 ребра для каждой вершины после обхода дерева. И тут оказалось, что дешевле swap-ать элементы в начало списка, а не хранить отдельно дополнительные индексы – полетел const
метода. И тд, включая написание рекурсии руками, чтобы не зависеть от размера стека и не тратить frame pointers.
Исправление snizovtsev, :
STL неплох для «набросать рабочий прототип за день». Для остального обычно его не хватает или не оптимален. В итоге часто финальному оптимизированному коду хватает фич на уровне C.
Например, недавно решил вспомнить молодость и порешать олимпиадную задачку на графы. Но писать код максимально оптимально, как будто в продакшн.
В итоге лапша вроде std::vector<std::vector<u32>> adj;
превращается в 2 вектора с объединёнными списками и оффсетами к ним. И всё, конец безопасности. А иначе жрёт память и страдает кеш промахами. Далее нужно было пометить 2 ребра для каждой вершины после обхода дерева. И тут оказалось, что дешевле swap-ать элементы в начало списка, а не хранить отдельно дополнительные индексы – полетел const
метода. И тд.
Исправление snizovtsev, :
STL неплох для «набросать рабочий прототип за день». Для остального обычно его не хватает или не оптимален. В итоге часто финальному оптимизированному коду хватает фич на уровне C.
Например, недавно решил вспомнить молодость и порешать олимпиадную задачку на графы. Но писать код решил максимально оптимально, как будто в продакшн.
В итоге лапша вроде std::vector<std::vector<u32>> adj;
превращается в 2 вектора с объединёнными списками и оффсетами к ним. И всё, конец безопасности. А иначе жрёт память и страдает кеш промахами. Далее нужно было пометить 2 ребра для каждой вершины после обхода дерева. И тут оказалось, что дешевле swap-ать элементы в начало списка, а не хранить отдельно дополнительные индексы – полетел const
метода. И тд.
Исходная версия snizovtsev, :
STL неплох для «набросать рабочий прототип за день». Для остального обычно его не хватает или не оптимален. В итоге часто финальному оптимизированному коду часто хватает фич на уровне C.
Например, недавно решил вспомнить молодость и порешать олимпиадную задачку на графы. Но писать код решил максимально оптимально, как будто в продакшн.
В итоге лапша вроде std::vector<std::vector<u32>> adj;
превращается в 2 вектора с объединёнными списками и оффсетами к ним. И всё, конец безопасности. А иначе жрёт память и страдает кеш промахами. Далее нужно было пометить 2 ребра для каждой вершины после обхода дерева. И тут оказалось, что дешевле swap-ать элементы в начало списка, а не хранить отдельно дополнительные индексы – полетел const
метода. И тд.