Я делаю оптимизацию скорости на своем собственном коде. ПСЕВДОКОД что-то вроде этого:(Speed) оптимизация, влияющая на неожиданный раздел кода
1. myStructure = constructStructure (param1)
2. processStructure(myStructure)
3. myStructure = constructStructure (param2)
4. processStructure(myStructure)
я была сосредоточена на оптимизации функции constructStructure(param)
начиная двух вызовов функции занимают около 75% времени. Я не касался функцииprocessStructure(structure)
.
я получил хорошую скорость вверх (все это в настоящее время принимает около 75% оригинального времени), но когда я измерил соответствующие времена операций 1.-4.
я получил неожиданные результаты:
before after
1. 75.10ms 56.88ms
2. 23.12ms 19.32ms
3. 70.72ms 53.22ms
4. 20.81ms 14.45ms
Я получил (небольшое, но) значительное ускорение в частях 2.
и 4.
, которые не были изменены! Это измеряется на 1000
пробегах и затем усредняется. (Я не вычислял стандартное отклонение, но я запускал и показывал отдельные времена 20-их раз для каждого варианта, и это, похоже, соответствует средним значениям).
Структуры, созданные до и после оптимизации, идентичны, насколько я могу судить, и конечный результат программы в обоих случаях одинаковый.
Отсутствие (существенное) утечки памяти Насколько я могу судить - я наблюдал за своей системной памятью во время тестовых прогонов и не было постоянного увеличения используемой памяти. (Я знаю, что это не очень хороший способ проверить это, и впасть в потенциальную утечку памяти - это моя следующая остановка. Кроме того, я действительно хочу освободить/удалить всю зарезервированную память, как только это мне не понадобится) ,
Не то, чтобы я не был доволен скоростью, , но я даже не могу понять, что произошло! Поскольку это код, который я буду использовать некоторое время после того, как я закончу работу над ним, наличие в коде кода тайн не является привлекательным вариантом.
Кто-нибудь есть какие-либо идеи относительно того, что случилось и как я могу проверить, если то, что вы предлагаете действительно так? PS. Я работаю в C++.
Как фактический код слишком велик, чтобы поместить здесь (100 линий для изготовления структуры + 300 строк для его обработки), я могу описать его немного, а также описывающее изменение:
constructStructure
это функция построения дерева структуру (не бинарное дерево) (на основе полутоновых пикселей изображения), Whe re каждому узлу присваивается атрибут int
.
Параметр функция constructStructure
является Comparator
, указывающий порядок интенсивностей пикселей (первый раз это less<int>()
, второй раз greater<int>()
).
только изменение в оптимизированной процедуры с использованием std::priority_queue
вместо std::multimap
реализовать кучи структуры (как описано в this question of mine - за исключением того, что не используется с std::pair<int,int>
, но вместо этого на std::pair<int,myData>
)
Я подтвердил, что произведенный myStructure
является эквивалентом Дерево (путем изучения полученного дерева для разных изображений) в некотором смысле:
- полученное дерево имеет число узлов
- данных, содержащиеся в узлах же является же
- но порядок детей в пределах узла отличается при использовании
std::multimap
, чем при использованииstd::priority_queue
(дети снова являются узлами, содержащими одни и те же данные) - заключение: деревья эквивалентны, чтобы данные, которые он хранит и его структура вплоть до порядка дочерних узлов в пределах какого-либо одного родительского узла
processStructure
Это функция, которая исследует построенное дерево, в стиле DFS (снизу вверх). Сложность зависит только от числа узлов в дереве и проверяет только атрибут, назначенный каждому узлу (а не данные, содержащиеся в узле, которые доступны для дальнейшей обработки, не используются здесь).
Наконец, после дальнейшего тестирования и различия между порядком узлов я указал, вопрос будет:возможно, что порядок узлов в дереве производит это существенное изменение в производительности, даже если (при обходе дерева с помощью подхода DFS) данные в узлах не проверяются, а только один целочисленный атрибут для каждого узла?
Боюсь, нет никакого способа проанализировать это, не видя фактического код. – Vince
У вас есть * подтвержденный *, что вы не изменили поведение? это 'myStructure' же после оптимизации? –
Может быть что угодно. Возможно, эффект кеша. –