Микрооптимизация — оптимизация компилятора при доступе к рекурсивным элементам

Я заинтересован в написании хорошего кода с самого начала вместо оптимизации кода позже. Извините, что не предоставил тест. У меня нет рабочего сценария на данный момент. Спасибо за внимание!

Каков прирост производительности при использовании FunctionY по сравнению с FunctionX?

Об этом уже идет много дискуссий о stackoverflow, но я сомневаюсь, что при доступе к подчиненным элементам (рекурсивным), как показано ниже. Будет ли компилятор (скажем, VS2008) оптимизировать FunctionX во что-то вроде FunctionY?

void FunctionX(Obj * pObj)
{
pObj->MemberQ->MemberW->MemberA.function1();
pObj->MemberQ->MemberW->MemberA.function2();
pObj->MemberQ->MemberW->MemberB.function1();
pObj->MemberQ->MemberW->MemberB.function2();
..
pObj->MemberQ->MemberW->MemberZ.function1();
pObj->MemberQ->MemberW->MemberZ.function2();
}

void FunctionY(Obj * pObj)
{
W * localPtr = pObj->MemberQ->MemberW;
localPtr->MemberA.function1();
localPtr->MemberA.function2();
localPtr->MemberB.function1();
localPtr->MemberB.function2();
...
localPtr->MemberZ.function1();
localPtr->MemberZ.function2();
}

0

Решение

В случае, если ни один из указателей участника не является изменчивым или указателем на изменчивым, и у вас нет operator -> перегружены для любых членов в цепочке обе функции одинаковы.
Предложенное вами правило оптимизации широко известно как устранение общего выражения и поддерживается подавляющим большинством компиляторов в течение многих десятилетий.

2

Другие решения

Теоретически, вы экономите на дополнительных разыменованиях указателей, ОДНАКО в реальном мире компилятор, вероятно, оптимизирует его для вас, так что это бесполезная оптимизация.

Вот почему важно сначала профилировать, а потом оптимизировать. Компилятор делает все возможное, чтобы помочь вам, вы также можете убедиться, что вы не просто делаете то, что уже делают.

1

если компилятор достаточно хорош, он должен перевести functionX во что-то похожее на functionY.
Но вы можете получить разные результаты на разных компиляторах и на одном и том же компиляторе с разными флагами оптимизации.
Использование «тупой» функции компилятора должно быть более быстрым, и ИМХО, оно более читабельно и быстрее для кодирования. Так что придерживайтесь функции Y

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

0
По вопросам рекламы [email protected]