задачка про указатель на метод
От: e-Xecutor Россия  
Дата: 15.06.11 16:02
Оценка:
Есть такие штуковины (упрощенно):
struct StackItem{
};
template <class T>
struct StackValueItem:Base{
T value;
};
typedef std::vector<StackItem*> DataStack;


Есть метод класса:
  RetType method(Type1 arg1,Type2 arg2);


Допустим последние два элемента DataStack это StackValueItem<Type1>* и StackValueItem<Type2>*.

Мне нужно "завернуть" вызов во что-то, что автоматом скастит элементы DataStack
к нужным типам, вызовет method, и уберёт из вектора 2 последних элемента,
и заменит на DataStack<RetType>*.

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

Моё решение выглядит как-то так (DataStack тут мой класс, не вектор):
  struct RuleHandlerBase{
    virtual void handleRule(DataStack& stack,RuleEntry re)=0;
  };
#define ARG(n,arg_type) ((StackValueItem<arg_type>&)*(stack.last[n])).value
  template <class P,class RV,class A1,class A2>
  struct RuleHandler2:RuleHandlerBase{ 
  P* p;
  RV (P::*method)(A1,A2);
  RuleHandler2(P* argP,RV (P::*argMethod)(A1,A2)):p(argP),method(argMethod){}
  void handleRule(DataStack& stack,RuleEntry re)
  {
    stack.replace(2,new StackValueItem<RV>((p->*method)(ARG(-1,A1),ARG(0,A2)),re));
  }
  };

  template <class RV,class A1,class A2>
  void add2(const SeqInfo& rule,RV (ImplType::*method)(A1,A2))
  {
    parseRule(rule).handler=new RuleHandler2<ImplType,RV,A1,A2>((ImplType*)this,method);
  }

Классы и методы от 0 до стольки, сколько нужно.

Вызов addN выглядит так:
  add2(SeqInfo("expr call","expr: expr tORBr- arglist tCRBr-",300),&ZParser::handleCall);


Я в курсе про boost::function. Но... Я пробовал chaiscript и примеры из boost::spirit.
На моей десктопной машинке примеры компилируются по несколько минут,
и компилятор (gcc) при этом съедает под гиг памяти. Как-то мне это не нравиться.
Опять таки, clang++ вообще попрехнулся chaiscript. Ошибка не влезла в один экран терминала...

Мне не нужно supergeneric решения, мне хватит конкретного решения конкретной задачи.
Ургументы методов и возвращаемые значения в большинстве своём указатели.
Re: задачка про указатель на метод
От: uzhas Ниоткуда  
Дата: 15.06.11 16:48
Оценка:
Здравствуйте, e-Xecutor, Вы писали:

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

что-то вы не то померили
я не чувствую оверхедов в этих "уровнях косвенности", зато вижу в new (+поддержка ownership) + stack::replace
вы уверены, что ваш способ тормозит? можно указать какие действия хотелось бы убрать из-за ненужности?
Re[2]: задачка про указатель на метод
От: e-Xecutor Россия  
Дата: 16.06.11 03:42
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, e-Xecutor, Вы писали:


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

U>что-то вы не то померили
U>я не чувствую оверхедов в этих "уровнях косвенности", зато вижу в new (+поддержка ownership) + stack::replace
U>вы уверены, что ваш способ тормозит? можно указать какие действия хотелось бы убрать из-за ненужности?
Ну либо профайлер врёт, либо всё же дело (отчасти) в этом.
Вся эта косвенность круто вышибает мозги всяким кэшам и предсказаниям.
А new, по крайней мере в однопоточной среде, достаточно шустрый.
Теоретически хотелось бы конечно избавиться и от new.
Но как хранить стэк (почти) произвольных данных без аллокации на хипе, я что-то с ходу не придумаю.
Re: задачка про указатель на метод
От: e-Xecutor Россия  
Дата: 16.06.11 08:56
Оценка:
Здравствуйте, e-Xecutor, Вы писали:

Вот и верь после этого профайлерам.
Убрал почти всю косвенность, код стал ужасно неудобным, время исполнения теста уменьшилось примерно на 10%.

Заменил таки new/delete на placement new и сохранённый деструктор.
Время исполнения теста уменьшилось более чем в два раза...

В общем вопрос снят.
Re[2]: задачка про указатель на метод
От: alexeiz  
Дата: 16.06.11 14:48
Оценка:
Здравствуйте, e-Xecutor, Вы писали:

EX>Вот и верь после этого профайлерам.


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