Обсуждение статьи "Используйте EX5-библиотеки для продвижения своих разработок"

 

Опубликована статья Используйте EX5-библиотеки для продвижения своих разработок:

С помощью сокрытия реализации функций/классов в ex5-файл вы сможете делиться своими ноу-хау алгоритмами с другими программистами, создавать общие проекты и продвигать их в сети. И пока команда MetaQuotes всеми силами приближает возможность прямого наследования классов из ex5‑библиотек, мы реализуем данную возможность уже сейчас.

Автор: Alex Sergeev

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

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

С год назад тоже этим страдал, энтузизизма было море. Препятствия? не, нивидал. Хотя может у меня просто послепраздничное такое настроение ... :(

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

ведь это вам не просто обёртку сделать, тут на каждый чих нужно библу вызывать.

 
Urain:

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

Вообще-то как раз здесь все не так плохо.

Статья по делу. Либами пользуюсь постоянно -- это пока единственный способ нормального разделения кода.

Ты лучше скажи -- когда универсальные мега нейронки будут?

 

Urain:

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

проверял. разницы нет.

вот такой вызов пустышки Test при import или при include не влияет на время.

/*
#import "Graph.ex5"
        void Test(long achart,string name,int awnd,int ax,int ay,color aclr);
#import
*/
#include "Graph.mq5"
void OnStart()
{
  long a=GetTickCount();
  for (int i=0; i<1000000; i++) 
  {
    Test(0, "qwe", 0, 10, 10, clrRed);
  }
  Print(string(GetTickCount()-a));
}
 
TheXpert:

Вообще-то как раз здесь все не так плохо.

Статья по делу. Либами пользуюсь постоянно -- это пока единственный способ нормального разделения кода.

Ты лучше скажи -- когда универсальные мега нейронки будут?

Вашим же салом вам же по мусалам, а твои когда будут?

Честно говоря ещё немного почитаю твои посты и вообще брошу МТ5 нафик.

Достали все эти костыли до глубины души, куда не кинь всё наперекосяк, "а трамвай пускать собираются" :)

Нейронка валяется гдето, если серьёздно с настроем засесть там работы осталось фигня, а настроя нету.

 
sergeev:

проверял. разницы нет.

вот такой вызов пустышки Test при import или при include не влияет на время.

Как говорится почувствуй разницу:

2012.01.06 16:46:28    Калькулятор (EURUSD,H1)    пусто=281

2012.01.06 16:46:28    Калькулятор (EURUSD,H1)    либа=2344

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//+------------------------------------------------------------------+
#property library
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr) export
   {
    awnd=ax+ay;
   }
//+------------------------------------------------------------------+


#import "Test.ex5"
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr);
#import

void OnStart()
  {
   int res=0;
   long a=GetTickCount();
   for(int i=0; i<100000000; i++)
     {
      Test(0,"qwe",res,10,10,clrRed);
     }
   Print("либа=",string(GetTickCount()-a));
   
   a=GetTickCount();
   for(int i=0; i<100000000; i++)
     {
      res=10+10;
     }
   Print("пусто=",string(GetTickCount()-a));   
  }
 
Urain:

Как говорится почувствуй разницу:

не, так ты же про вызов функции спрашиваешь?

или скорость выполнения цикла вообще проверить решил?

я проверил разницу между просто вызовом функции, или вызовом из ex5 библы.  Разницы скорости вызова функций нет.


А то понятно, что пустой цикл без вызова функции будет работать быстрее. зачем вобще это проверять.

 
sergeev:

не, так ты же про вызов функции спрашиваешь?

или скорость выполнения цикла вообще проверить решил?

я проверил разницу между просто вызовом функции, или вызовом из ex5 библы.  Разницы скорости вызова функций нет.


А то понятно, что пустой цикл без вызова функции будет работать быстрее. зачем вобще это проверять.

Циклы одинаковые, исполняемые действия внутри циклов одинаковые (в одном случае прямо в цикле в другом случае внутри функции) разница во времени даёт чистое время вызова функции из либы.

Для чистоты эксперимента опишем аналогичную функцию прямо в файле:

2012.01.06 17:18:39    Калькулятор (EURUSD,H1)    пусто=281
2012.01.06 17:18:38    Калькулятор (EURUSD,H1)    либа=2281

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//+------------------------------------------------------------------+
#property library
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr) export
   {
    awnd=ax+ay;
   }
//+------------------------------------------------------------------+
#import "Test.ex5"
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr);
#import

void Testlocal(long achart,string name,int &awnd,int ax,int ay,color aclr)
   {
    awnd=ax+ay;
   }

void OnStart()
  {
   int res=0; int count=100000000;
   long a=GetTickCount();
   for(int i=0; i<count; i++)
     {
      Test(0,"qwe",res,10,10,clrRed);
     }
   Print("либа=",string(GetTickCount()-a));
   
   a=GetTickCount();
   for(int i=0; i<count; i++)
     {
      Testlocal(0,"qwe",res,10,10,clrRed);
     }
   Print("пусто=",string(GetTickCount()-a));   
  }

ЗЫ чтоб исключить ошибку, я даже длину цикла переписал от одной переменной count, результат тотже.

 

у меня в 4,5 раза

2012.01.06 17:28:33    test (EURUSD,D1)    ex5=2047
2012.01.06 17:28:31    test (EURUSD,D1)    локал=438

 
sergeev:

у меня в 4,5 раза

2012.01.06 17:28:33    test (EURUSD,D1)    ex5=2047
2012.01.06 17:28:31    test (EURUSD,D1)    локал=438

Алекс тебе этого мало?

там в 4 раза, тут в 2 раза итд.

начнём писать библы на основе библов, разы тормозов нарастут как снежный ком.

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

 

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

В тестах нужно обязательно учитывать неминуемое влияние оптимизатора кода. Данный пример цикла вообще вырождается в res=100; у приличного компилятора в случае локальной функции.  

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