Избавиться от ветвления внутри цикла
От: kfmn Россия  
Дата: 25.08.09 11:23
Оценка:
Всем привет!

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

void f(double *pArray,int mode)
{
  for (int k=0; k<K; k++)
  {
     Class *pObj=GetObj(k);
     for (int i=From(k); i<To(k); i++)
     {
        if (!Condition(i))
             continue;
        switch (mode)
        {
            case 0: 
               pObj->Fun0(pArray[i]);
               break;
            case 1: 
               pObj->Fun1(pArray[i]);
               break;
            case 2: 
               pObj->Fun2(pArray[i]);
               break;
            case 3: 
               pObj->Fun3(pArray[i]);
               break;
        }
     }
  }  
}


Т.е. в нее передается длинный массив, диапазоны индексов которого соответствуют некотором объектам.
Внутри каждого диапазона перебираются элементы массива и для тех из них, которые удовлетворяют некому условию, вызывается тот или иной метод соответствующего объекта.

Поскольку массив длинный, и функция вызывается часто, хочется, чтобы работала она по возможности быстрее. В этом смысле от ветвления внутри цикла хотелось бы избавиться. Но писать четыре совершенно идентичные за исключением имени методов Fun0-Fun3 функции неохота. Можно, конечно, вынести switch во внешний цикл, но это некая полумера — и код дублируется достаточно сильно, и если диапазонов много и они короткие — то прирост эффективности небольшой...

Подскажите, можно ли это эффективно сделать по-другому, без ненужного дублирования кода?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.