Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Документация доступна в CHM и PDF. Скачай в удобном тебе виде!
Dmitry Fedoseev
42875
Dmitry Fedoseev 2014.07.05 04:57 

Базовый класс, несколько потомков, используется один из потомков, в зависимости от параметров установленных на запуске. Это всем известный принцип работы универсальной программы. Не важно сколько вариантов может быть (т.е. классов - потомков), подразумевается, что это дело должно работать очень быстро, так как нет никаких вызовов 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
8277
Vladimir Gomonov 2014.07.05 06:36  
Integer:

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

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

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

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

Igor Chemodanov
779
Igor Chemodanov 2014.07.05 08:35  
MetaDriver:

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

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

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

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

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

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

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

Dmitry Fedoseev
42875
Dmitry Fedoseev 2014.07.05 14:23  

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

 

Файлы:
test2.mq4 11 kb
Dmitry Fedoseev
42875
Dmitry Fedoseev 2014.07.05 14:27  

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

 

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

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

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

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

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

Dmitry Fedoseev
42875
Dmitry Fedoseev 2014.07.05 14:50  
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
Админ
24944
Renat Fatkhullin 2014.07.05 14:55  

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

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

Dmitry Fedoseev
42875
Dmitry Fedoseev 2014.07.05 15:00  
Renat:

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

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

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