общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 06:35
Оценка:
к примеру, есть такой код, внутри функции

for(int i=0; i<1000000; i++)
{
}


если вдруг в коде всречается условие, приходящее параметром

for(int i=0; i<1000000; i++)
{
    if(bSome)
    {   // А
    }
    else
    {   // Б
    }
}


то в плане оптимизации, лучше разбить код на:

if(bSome)
    for(int i=0; i<1000000; i++)
    { А }
else
    for(int i=0; i<1000000; i++)
    { Б }


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

for(int i=0; i<1000000; i++)
{
    if(bA)
    {
        if(bB)
        {...}
        if(bC)
        {
            if(bD)
            {...}
        }
        ....
    }
}

с одной стороны, не хочется делать 1млн проверок, которые по длине кода могут быть порядка длины "полезного" функционала.
с другой стороны плодить кучу функций с почти одинаковым функционалом не хочется из-за неудобства разработки в нескольких местах сразу
есть идея сделать всё на дефайнах, но некоторые функции большие по размеру, всё будет выглядеть кривовато
вроде бы ещё можно как-то это всё на шаблонах сделать, нет? Чтоб в зависимости от параметров часть кода не генерилась?
Re: общий вопрос по оптимизации кода
От: Ops Россия  
Дата: 28.03.13 06:42
Оценка:
Здравствуйте, CEMb, Вы писали:

Например, создать лямбду по условиям и звать в цикле. А эта оптимизация вообще нужна, компилятор не умеет? Посмотри, что там в релизе генерируется.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 07:02
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Например, создать лямбду по условиям и звать в цикле. А эта оптимизация вообще нужна, компилятор не умеет? Посмотри, что там в релизе генерируется.


Прошу прощения, лямбда — это кто?
Оптимизация нужна, потому что real-time, и функций таких куча т.е. спасаю производительность по максимуму, как могу... внутренний код наполовину на асме уже написан
Re[2]: общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 07:13
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Например, создать лямбду по условиям и звать в цикле.


А лямбды с какой версии сей поддерживаются?
Re: общий вопрос по оптимизации кода
От: Кодт Россия  
Дата: 28.03.13 07:21
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>с одной стороны, не хочется делать 1млн проверок, которые по длине кода могут быть порядка длины "полезного" функционала.

CEM>с другой стороны плодить кучу функций с почти одинаковым функционалом не хочется из-за неудобства разработки в нескольких местах сразу
CEM>есть идея сделать всё на дефайнах, но некоторые функции большие по размеру, всё будет выглядеть кривовато
CEM>вроде бы ещё можно как-то это всё на шаблонах сделать, нет? Чтоб в зависимости от параметров часть кода не генерилась?

Можно и на дефайнах.
По сути, нужно выполнить такую трансформацию кода
for(.....)         |
  if(aaaaa)        | if(bbbbb)
                   |   for(.....)
    { AAAAA }      |     { AAAAA }
  else if(bbbbb)   | else if(bbbbb)
                   |   for(.....)
    { BBBBB }      |     { BBBBB }
  else             | else
                   |   for(.....)
    { CCCCC }      |     { CCCCC }

То есть, многократно повторяется заголовок цикла. Значит, прямо в теле функции пишем
void foo(.....)
{
#define REPEAT for(.....)
  if     (aaaaa) REPEAT { AAAAA }
  else if(bbbbb) REPEAT { BBBBB }
  else           REPEAT { CCCCC }
#undef REPEAT
}

По-моему, вполне нормальное, "eye driven", сопровождаемое решение.
Более того, можно чуток допилить, чтобы выбирать между for-if и if-for
#define REPEAT for(.....)
// присваиваем этот дефайн в ОДИН из следующих
#define REPEAT_HEAD
#define REPEAT_BODY REPEAT

REPEAT_HEAD {
  if     (aaaaa) REPEAT_BODY { AAAAA }
  else if(bbbbb) REPEAT_BODY { BBBBB }
  else           REPEAT_BODY { CCCCC }
}

#undef REPEAT_HEAD
#undef REPEAT_BODY
#undef REPEAT


Та же фигня с лямбдами может пойти по двум путям.
1) завернуть каждую ветку в лямбду, условным оператором выбрать одну из них и скормить единственному for.
2) завернуть в лямбду заголовок цикла — то есть, тот же #define REPEAT, только без дефайнов
Оба способа плохи тем, что получится косвенный вызов. А если лямбда будет приведена к std::function, то это не просто вызов по указателю на функцию, а довольно жирный косвенный вызов.
Перекуём баги на фичи!
Re[3]: общий вопрос по оптимизации кода
От: Ops Россия  
Дата: 28.03.13 07:35
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Прошу прощения, лямбда — это кто?


Прошу прощения, думал плюсы
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: общий вопрос по оптимизации кода
От: Кодт Россия  
Дата: 28.03.13 07:45
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Прошу прощения, думал плюсы

Таки плюсы, ибо "вроде бы ещё можно как-то это всё на шаблонах сделать, нет?"
Перекуём баги на фичи!
Re[5]: общий вопрос по оптимизации кода
От: Ops Россия  
Дата: 28.03.13 08:03
Оценка:
Здравствуйте, Кодт, Вы писали:

Ops>>Прошу прощения, думал плюсы

К>Таки плюсы, ибо "вроде бы ещё можно как-то это всё на шаблонах сделать, нет?"
Тогда вопрос про лямбды мне непонятен Они же фактически задолго до выхода C++11 в компиляторах появились, сложно не заметить. Да и стандарту уже второй год идет.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: общий вопрос по оптимизации кода
От: uzhas Ниоткуда  
Дата: 28.03.13 08:14
Оценка: +4
Здравствуйте, CEMb, Вы писали:

CEM>к примеру

use profiler, Luke!
Re[6]: общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 08:34
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>>>Прошу прощения, думал плюсы

К>>Таки плюсы, ибо "вроде бы ещё можно как-то это всё на шаблонах сделать, нет?"
Ops>Тогда вопрос про лямбды мне непонятен Они же фактически задолго до выхода C++11 в компиляторах появились, сложно не заметить. Да и стандарту уже второй год идет.

Ну я не заметил я на шестой студии сижу, она ругается на функции внутри функций
Re[2]: общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 08:35
Оценка:
Здравствуйте, uzhas, Вы писали:

CEM>>к примеру

U>use profiler, Luke!

А какой?
Re[2]: общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 08:41
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Можно и на дефайнах.


У меня вот такая мутохрень получилась:


#define PRC_FUNC(result, name, fnctr1, fnctr2, fnctr3, rtrn) \
result name () \
{\
    for(int i=0; i<100; i++)\
    {\
        fnctr1 \
        fnctr2 \
        { \
            fnctr3 \
        } \
        printf("%d \n", i);\
    }\
    rtrn;\
}\

PRC_FUNC(void, FullScan, ;, ;, ;, ;);
PRC_FUNC(void, Scan10, if(i>10){break;}, if(i<10), i=i+1;, ;);


int main() {

    FullScan();
    Scan10();
...
}

на шестой студии работает.

фигзнает... надо попробовать... но код на глаз неприятный... и обратные слеши тоже не радуют
и мои функции по-больше размером, и число переменных там переменное
Re[3]: общий вопрос по оптимизации кода
От: uzhas Ниоткуда  
Дата: 28.03.13 08:44
Оценка: 4 (1)
Здравствуйте, CEMb, Вы писали:

CEM>А какой?


http://www.rsdn.ru/forum/cpp.applied/952913.flat
Автор: kondrik
Дата: 17.12.04

http://www.rsdn.ru/forum/cpp.applied/1001241.flat
Автор: bkat
Дата: 24.01.05

http://www.rsdn.ru/forum/cpp.applied/2378166.flat
Автор: c-smile
Дата: 23.02.07
Re: общий вопрос по оптимизации кода
От: fin_81  
Дата: 28.03.13 08:54
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>но как быть, если условий много, и все они задаются параметрами функции?


CEM>
CEM>for(int i=0; i<1000000; i++)
CEM>{
CEM>    if(bA)
CEM>    {
CEM>        if(bB)
CEM>        {...}
CEM>        if(bC)
CEM>        {
CEM>            if(bD)
CEM>            {...}
CEM>        }
CEM>        ....
CEM>    }
CEM>}


Если компилятор не может это оптимизировать, то дальнейшая оптимизация по скорости ведет к увеличению количества исходного кода. Если хочется использовать общий код во всех ифах, придется повторить структуру ифов (статик ифов) внутри этого общего метода. То есть при изменении логики придется менять в 2 и более местах.
Re[7]: общий вопрос по оптимизации кода
От: Vzhyk  
Дата: 28.03.13 09:02
Оценка:
On 28.03.2013 11:34, CEMb wrote:

> Ну я не заметил я на шестой студии сижу, она ругается на функции внутри

> функций
Можно нескромный вопрос: "А зачем?"
Posted via RSDN NNTP Server 2.1 beta
Re[8]: общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 09:03
Оценка:
Здравствуйте, Vzhyk, Вы писали:

>> Ну я не заметил я на шестой студии сижу, она ругается на функции внутри

>> функций
V>Можно нескромный вопрос: "А зачем?"

Зачем что?
Re[9]: общий вопрос по оптимизации кода
От: Vzhyk  
Дата: 28.03.13 09:05
Оценка:
On 28.03.2013 12:03, CEMb wrote:

> Зачем что?

Зачем ты "на шестой студии сидишь"?
У нее же уже лет как 10 не осталось ни одного достоинства, кроме
глючности, неподдерживаемости современного С++ и замедления разработки.
Posted via RSDN NNTP Server 2.1 beta
Re[10]: общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 09:08
Оценка: :))
Здравствуйте, Vzhyk, Вы писали:

>> Зачем что?

V>Зачем ты "на шестой студии сидишь"?
V>У нее же уже лет как 10 не осталось ни одного достоинства, кроме
V>глючности, неподдерживаемости современного С++ и замедления разработки.

У неё класс-визард удобнее, чем у 10-й
Re: общий вопрос по оптимизации кода
От: watch-maker  
Дата: 28.03.13 09:40
Оценка: 4 (1) +2
Здравствуйте, CEMb, Вы писали:

CEM>но как быть, если условий много, и все они задаются параметрами функции? :???:


CEM>
CEM>for(int i=0; i<1000000; i++)
CEM>{
CEM>    if(bA)
CEM>    {
CEM>        if(bB)
CEM>        {...}
CEM>        if(bC)
CEM>        {
CEM>            if(bD)
CEM>            {...}
CEM>        }
CEM>        ....
CEM>    }
CEM>}


CEM>вроде бы ещё можно как-то это всё на шаблонах сделать, нет? Чтоб в зависимости от параметров часть кода не генерилась?


Использовать шаблоны для оптимизации можно, и получается даже хорошо. По крайней мере код внутри функции будет максимально похож на вариант до преобразования.
template <bool bA, bool bB, bool bC, bool bD> void foo(...)
{
  for(int i=0; i<1000000; i++)
  {
    if(bA)
    {
        if(bB)
        {...}
        if(bC)
        {
            if(bD)
            {...}
        }
        ....
    }
  }
}
Правда придётся чуть изменить вызов функции, но и там изменения малы.

Ну и правильно советуют, что переписывать стоит только после того, как об этом тебе сообщил профайлер.
Но я бы сначала ещё проверил, что делает твой компилятор с исходным текстом. Например, gcc, если ему указать уровень оптимизации -O3, самостоятельно разбивает твой исходный цикл с условиями bA…bD на несколько однородных циклов. То есть он сначала проверяет все условия, и затем переходит к нужному циклу, внутри которого уже никаких проверок не делается (и ненужный код из которых уже удалён). То есть компилятор оказался достаточно умным, чтобы сразу же выполнить твоё желание (и не нужно никаких макросов, шаблонов или дублирования исходного кода).
Re[2]: общий вопрос по оптимизации кода
От: CEMb  
Дата: 28.03.13 10:02
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>Использовать шаблоны для оптимизации можно, и получается даже хорошо. По крайней мере код внутри функции будет максимально похож на вариант до преобразования.

WM>
template <bool bA, bool bB, bool bC, bool bD> void foo(...)
WM>{
WM>  for(int i=0; i<1000000; i++)
WM>  {
WM>    if(bA)
WM>    {
WM>        if(bB)
WM>        {...}
WM>        if(bC)
WM>        {
WM>            if(bD)
WM>            {...}
WM>        }
WM>        ....
WM>    }
WM>  }
WM>}
WM>
Правда придётся чуть изменить вызов функции, но и там изменения малы.


А, это же с учётом того, что оптимизатор порежет все констнтые условия?!! Блин, чё я сам не догадался до этого...

WM>Ну и правильно советуют, что переписывать стоит только после того, как об этом тебе сообщил профайлер.


да, надо всё-таки заиспользовать профайлер...

WM>Но я бы сначала ещё проверил, что делает твой компилятор с исходным текстом. Например, gcc, если ему указать уровень оптимизации -O3, самостоятельно разбивает твой исходный цикл с условиями bA…bD на несколько однородных циклов. То есть он сначала проверяет все условия, и затем переходит к нужному циклу, внутри которого уже никаких проверок не делается (и ненужный код из которых уже удалён). То есть компилятор оказался достаточно умным, чтобы сразу же выполнить твоё желание (и не нужно никаких макросов, шаблонов или дублирования исходного кода).


Опаньки, как, оказывается, далеко техника ушла А я тут сижу (у меня микрософтовский компилятор, VС6.0, VС2010), вручную код разбираю... асм-вставки в дефайнах пишу... ну, кстати, на 6-й студии это часто сильно помогало...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.