Скачать MetaTrader 5

Блеск и нищета ООП

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmitry Fedoseev
47056
Dmitry Fedoseev  

Базовый класс, несколько потомков, используется один из потомков, в зависимости от параметров установленных на запуске. Это всем известный принцип работы универсальной программы. Не важно сколько вариантов может быть (т.е. классов - потомков), подразумевается, что это дело должно работать очень быстро, так как нет никаких вызовов if или switch для изменения работы программы, только один раз при инициализации выбрали нужный класс - потомок, дальше все работает прямо и просто. 

class CBase{
   private:
   public:
      virtual void Fun(){
      
      }
};

class CClass1:CBase{
   private:
   public:
      void Fun(){
      
      }
};

CClass1 * cl;

void OnInit(){

   cl=new CClass1;

}

Однако...

Сколько может быть разных вариантов? Разумное число? 10, 20, 100? Даже при 100 вариантах switch работает быстрее ООП.

В приложении скрипт для сравнения быстродействия. Сравнивается вышеприведенное ООП и просто switch с функциями (причем вызывается две функции, от одного из вызовов функции можно легко избавиться).

void ff(int z){

      switch(z){
         case 0:
         f0();
         break;

         ...

         case 99:
         f99();
         break;

      }
     
}
Результаты (вызов f99): 

 

Файлы:
test.mq4 9 kb
Vladimir Gomonov
8339
Vladimir Gomonov  
Integer:

Сколько может быть разных вариантов? Разумное число? 10, 20, 100? Даже при 100 вариантах switch работает быстрее ООП.

Хочу немного предостеречь от чрезмерных обобщений.  Такой эффект резонно ожидать в mql, поскольку в нём используются виртуальные "псевдоуказатели" - по сути хендлы ссылающиеся на внутреннюю (скрытую) хеш-таблицу реальных адресов. Для разрешения таких указателей, требуется существенное дополнительное время, значительно превосходящее непосредственную адресацию по указателю.  Я не измерял, но скорее всего подобный же эффект "притормаживания" указателей будет обнаруживаться в dotNET-языках и других подобных реализациях.

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

Так что ООП по сути ни при чём..

Igor Chemodanov
850
Igor Chemodanov  
MetaDriver:

Хочу немного предостеречь от чрезмерных обобщений.  Такой эффект резонно ожидать в mql, поскольку в нём используются виртуальные "псевдоуказатели" - по сути хендлы ссылающиеся на внутреннюю (скрытую) хеш-таблицу реальных адресов. Для разрешения таких указателей, требуется существенное дополнительное время, значительно превосходящее непосредственную адресацию по указателю.  Я не измерял, но скорее всего подобный же эффект "притормаживания" указателей будет обнаруживаться в dotNET-языках и других подобных реализациях.

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

Так что ООП по сути ни при чём..

Понятно, что дело лишь в самом компиляторе, следовательно, что при "правильной" компиляции время исполнения приведенных выше примеров сравняется.
Vladimir Gomonov
8339
Vladimir Gomonov  
icas:
Понятно, что дело лишь в самом компиляторе, следовательно, что при "правильной" компиляции время исполнения приведенных выше примеров сравняется.
Понятие "правильности" зависит от правил, следовательно бессодержательно. ;)
MetaQuotes
Админ
26091
Renat Fatkhullin  

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

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

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

Dmitry Fedoseev
47056
Dmitry Fedoseev  

Вот с не пустыми функциями:

 

Файлы:
test2.mq4 11 kb
Dmitry Fedoseev
47056
Dmitry Fedoseev  

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

 

Файлы:
test3.mq4 12 kb
MetaQuotes
Админ
26091
Renat Fatkhullin  
Integer:

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

Как все запущено...

Вы что-нибудь про инлайнинг слышали? А про агрессивный инлайнинг?

Что обычно происходит с простыми телами функций и что с ними делает нормальный оптимизирующий компилятор? Сейчас ведь не 1995 год.

Dmitry Fedoseev
47056
Dmitry Fedoseev  
MetaDriver:

Хочу немного предостеречь от чрезмерных обобщений.  Такой эффект резонно ожидать в mql, поскольку в нём используются виртуальные "псевдоуказатели" - по сути хендлы ссылающиеся на внутреннюю (скрытую) хеш-таблицу реальных адресов. Для разрешения таких указателей, требуется существенное дополнительное время, значительно превосходящее непосредственную адресацию по указателю.  Я не измерял, но скорее всего подобный же эффект "притормаживания" указателей будет обнаруживаться в dotNET-языках и других подобных реализациях.

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

Так что ООП по сути ни при чём..

Ага. Вот на До диезе:)


7550021 (switch)
2250004 (OOP)
7325029 (switch)
2050015 (OOP)
7550049 (switch)
2150005 (OOP)
7575031 (switch)
2325009 (OOP)
8025038 (switch)
2200004 (OOP)
7150027 (switch)
2050014 (OOP)
7375029 (switch)
2200005 (OOP)
7550022 (switch)
1950003 (OOP)
7100021 (switch)
2695083 (OOP)
7360033 (switch)
2200008 (OOP)
7825029 (switch)
1925010 (OOP)
7325025 (switch)
2025006 (OOP)
6850035 (switch)
2525014 (OOP)
7750027 (switch)
1975007 (OOP)
8195225 (switch)
2050004 (OOP)
6950020 (switch)
2425006 (OOP)
7275029 (switch)
2225015 (OOP)
7050037 (switch)
2200007 (OOP)
7375030 (switch)
 

MetaQuotes
Админ
26091
Renat Fatkhullin  

Любой тест начинайте с доказательств, что он корректный и в нем реально замеряется то, что заявлено.

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

Dmitry Fedoseev
47056
Dmitry Fedoseev  
Renat:

Любой тест начинайте с доказательств, что он корректный и в нем реально замеряется то, что заявлено.

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

Зачем мне понимать механизмы компиляции? Только для того, чтобы уверовать, что плохой резлультат лучше хорошего?  Имеет значение результат. 
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий