LINUX.ORG.RU

[c++] early returns vs instrucion cache

 


0

2

Читал тут статью, наткнулся на фразу «Avoid early returns or lots of function calls to “help” performance, as it kills the instruction cache.»

Нет, ну я понимаю про «lots of function calls», а что там с «early returns»? Может имеется в виду «early returns» как типа оптимизация «lots of function calls»?

Что скажут знатоки?

★★★★★

может подразумевается вызов большого кол-ва функций, которые не заинлайнены или функции, у которых первыми строками идет if (!param) return 1; и функции на них часто нарываются?

x0r ★★★★★
()
Ответ на: комментарий от x0r

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

с этим понятно, оно там подразумевается, оно так и есть

функции, у которых первыми строками идет if (!param) return 1; и функции на них часто нарываются?

ну то есть следует предпочитать конструкцию (2) конструкции (1)

//(1)
void foo() {
    if(!bar) { return; }
    /* some code */
}

//(2)
void foo() {
    if(bar) { 
        /* some code */ 
    }
}

эм... нарисовав код я, кажется, стал понимать откуда ноги растут :) большое спасибо

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

> эм... нарисовав код я, кажется, стал понимать откуда ноги растут :) большое спасибо

А я не понимаю. Почему это (1) хуже, чем (2)? В смысле, за счет чего производительность падает?
Я использую (1) потому, что так меньше вложенности и читать проще.

anonymous
()

> а что там с «early returns»?

Преданья старины глубокой. Да и вообще - советы идиотские.

LamerOk ★★★★★
()

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

amaora ★★
()
Ответ на: комментарий от anonymous

оба варианта говно. push, push, call, <save_stack_ptr>, <restore_stack_ptr>, ret, pop, pop

полезного кода не выполняется, а мусора навалом. инлайнить надо.

x0r ★★★★★
()
Ответ на: комментарий от anonymous

> эм... нарисовав код я, кажется, стал понимать откуда ноги растут :) большое спасибо

А я не понимаю. Почему это (1) хуже, чем (2)?

сравни код: в варианте (1) добавляется лишний return - нафиг он не нужен (по крайней мере в такой постановке задачи)

В смысле, за счет чего производительность падает?

вообще у меня есть мнение, что автор этой фразы просто некорректно высказался :)

shty ★★★★★
() автор топика
Ответ на: комментарий от arsi

какие ещё предсказания? там код идентичный генерируется.

как можно такое говорить, не имея кода вообще? О_о

shty ★★★★★
() автор топика
Ответ на: комментарий от amaora

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

ну почему же, это не такая уж тонкая материя

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

> как можно такое говорить, не имея кода вообще? О_о

ты наркоман штоле? я о твоём примере кода говорю.

arsi ★★★★★
()
Ответ на: комментарий от arsi

> как можно такое говорить, не имея кода вообще? О_о

ты наркоман штоле? я о твоём примере кода говорю.

где там код? это просто шаблон, если его прогнать с -О3 там вообще ничего не останется наверное :)

или ты про тайный смысл

/* some code */

?

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

> где там код? это просто шаблон

и по этому шаблону, т.е. шаблонам, практически любой оптимизирующий компилятор даст одинаковый код, что бы там в /* some code */ не было.

похоже, ты просто компиляторов никогда не писал ;)

arsi ★★★★★
()

> Что скажут знатоки?

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

aho
()

Питонисты, у которых вызов функции приводит к поиску в хеш таблице, смотрят с недоумением.

AST-PM-105
()
Ответ на: комментарий от arsi

похоже, ты просто компиляторов никогда не писал ;)

теорию немножко знаю, а так - да, не писал :)

shty ★★★★★
() автор топика
Ответ на: комментарий от pathfinder

Да, умеют, особенно, когда эта функция в отдельном модуле.

anarquista ★★★★★
()
Ответ на: комментарий от pathfinder

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

А далее в коде бы это выглядело бы почти так же, как простой вызов функции.

anarquista ★★★★★
()
Ответ на: комментарий от anarquista

Вручную это легко сделать с помощью макросов

Вручную это легко сделать и без макросов, просто разбиваешь функцию на две. Одна из них будет inline.

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

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Угу, и каждый раз тебе придется писать в коде две функции вместо одной. И наверняка один раз ошибка да случится: одну функцию пропустишь. А компилятор не сообщит об ошибке. А потом ВНЕЗАПНО…

anarquista ★★★★★
()
Ответ на: комментарий от pathfinder

Интересно, а компиляторы умеют выносить некоторый код за пределы функции? Ну, то есть, частичный inline.

нет, и слава богу :)

shty ★★★★★
() автор топика
Ответ на: комментарий от anarquista

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

copypaste is the root of all evil :)

вообще, если правильно писать, - не должно получаться так, что один и тот же код появляется в 2-х местах

А потом ВНЕЗАПНО…

ошибку поймают модульные тесты?

shty ★★★★★
() автор топика
Ответ на: комментарий от JackyTreehorn

я не уверен что правильно понял Вас :)

shty ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

Потому что уродовать код ради производительности - последняя стадия оптимизации.

почему же, уродовать? :) мне часто удобнее работать с точки зрения DOD, нежели городить правильную и строгую иерархию объектов, которую потом с мылом в попе надо будет ещё распараллеливать

shty ★★★★★
() автор топика
Ответ на: комментарий от JackyTreehorn

Я только не завидую потом тем, кому потом придется ловить баги в твоем жутко оптимальном коде.

и правильно, чего модульным тестам завидовать

между дрочим (с) если этот же код написать используя классический ООП-подход результат получится сложнее для понимания :)

и потом, я ж не такие «шишки» пишу:

static inline complexd operator~(complexd const & a) {
    static const union {
        int i[4]; __m128d v;
    } signbithigh = {0,0,0,0x80000000};

    return _mm_xor_pd(a, signbithigh.v);
}
shty ★★★★★
() автор топика
Ответ на: комментарий от JackyTreehorn

В общем случае действует правило 80/20.

80% кода пишутся 20% времени? :)

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

> почему же, уродовать? :) мне часто удобнее работать с точки зрения DOD, нежели городить правильную и строгую иерархию объектов

При чём тут иерархия объектов? В этих советах предлагают избегать вызова функций, чего можно достичь только вставкой тела вызываемой функции в вызывающую. Из чего со всей очевидностью проистекает то, что советы эти времен до появления inline, и то, что они идиотские.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

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

вовсе и нет, там разное рекомендуется, но в числе прочего рекомендуется использовать inline (с умом конечно, не inline'ить всё что движется)

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

> с умом конечно, не inline'ить всё что движется

Тоже идиотизм, потому что inline - это запрос на встраивание, а не указание. Компилятор не обязан встраивать функцию.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> с умом конечно, не inline'ить всё что движется

Тоже идиотизм, потому что inline - это запрос на встраивание, а не указание. Компилятор не обязан встраивать функцию.

ты статью нашёл и читаешь, или просто там себе что-то придумал? скажи честно :)

shty ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

Я твои цитаты из нее комментирую.

я здесь привёл только одну цитату, и Вы «комментируете» то, чего в той цитате впринципе нет

Буду я еще по ссылкам ходить...

каким ссылкам?

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

> я здесь привёл только одну цитату, и Вы «комментируете» то, чего в той цитате впринципе нет

А вот это там есть:

в числе прочего рекомендуется использовать inline

Вот его-то я и комментирую.

каким ссылкам?

Да какая разница по каким?!

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> в числе прочего рекомендуется использовать inline

Вот его-то я и комментирую.

так это не цитата, это моя прямая речь

shty ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

> с умом конечно, не inline'ить всё что движется

Тоже идиотизм, потому что inline - это запрос на встраивание, а не указание. Компилятор не обязан встраивать функцию.

уж раз пошла такая пианка отвечу

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

shty ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

ну знаете, этак можно назвать оппонента, к примеру, говном, а потом, когда он начнёт возмущаться, сказать, что тот к словам цепляется :)

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

а смысл в inline ? если при оптимизации по скорости и так как выразился shty «инлайнится все что движется» ну кроме очень больших функций мы же все равно включаем оптимизацию для релизной версии

osox
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.