Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет времени изучать MQL5? Библиотека исходников для вас!
MetaQuotes Software Corp.
Модератор
181011
MetaQuotes Software Corp. 2012.01.06 10:21 

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

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

Автор: Alex Sergeev

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

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

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

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

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

Комбинатор
15914
Комбинатор 2012.01.06 15:00  
Urain:

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

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

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

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

o_o
Модератор
23689
o_o 2012.01.06 15:23  

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));
}
Nikolay Demko
12462
Nikolay Demko 2012.01.06 15:38  
TheXpert:

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

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

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

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

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

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

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

Nikolay Demko
12462
Nikolay Demko 2012.01.06 15:48  
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));   
  }


o_o
Модератор
23689
o_o 2012.01.06 15:58  
Urain:

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

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

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

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


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

Nikolay Demko
12462
Nikolay Demko 2012.01.06 16:21  
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, результат тотже.

o_o
Модератор
23689
o_o 2012.01.06 16:27  

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

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

Nikolay Demko
12462
Nikolay Demko 2012.01.06 16:40  
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 раза итд.

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

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

MetaQuotes
Админ
24944
Renat Fatkhullin 2012.01.06 16:53  

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

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

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

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