文章 "利用 EX5 库来推动您的项目开发"

 

新文章 利用 EX5 库来推动您的项目开发已发布:

隐藏 .ex5 文件中类/函数的实施细节,会让您能够同其他开发人员共享自己的专有算法,设立共同项目并在网络中宣传它们。而且,在 MetaQuotes 团队不遗余力地引入直接继承 ex5 库类可能性的同时,我们现在就要付诸实施了。

类方法输出图

作者:o_O

 
当然,如果你的主要工作是在诀窍函数上,就没有必要事先为它们制作ISuperClass 封装。只需导出这些诀窍函数,让第三方程序员创建自己的封装类,以后就可以轻松继承了。

Ai maladitsa,你惹恼了自己,你纠正了自己,在我们做得不好的时候又插了一杠子。

一年前,我也深受其害,但我有满腔热情。障碍?也许我只是节后心情不好......:(

与调用本地类函数相比,调用库函数的成本是多少?

这不仅仅是一个简单的封装,每次打喷嚏都要调用库函数。

 
Urain:

好样的,你尿裤子了,你修好了自己,又一个插头,而我们的情况却不太好。

其实,这里也没那么糟。

这是篇好文章。我一直在使用库,这是迄今为止唯一一种正常的代码分离方式。

你最好告诉我,什么时候会有通用的巨型神经元?

 

Urain:

调用库函数 的成本与调用本地类函数的成本相比是多少?

我查过了,没有区别。

在导入或包含时调用 Test empty 函数不会影响时间。

/*
#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:

其实,这里的情况并没有那么糟糕。

文章一针见血。我一直在使用库,这是迄今为止唯一能正确分离代码的方法。

什么时候会有通用的巨型神经元?

你的神经元什么时候会出现?

老实说,我会多看看你的文章,然后彻底放弃 MT5。

我从灵魂深处厌倦了所有这些拐杖,无论我转到哪里,一切都乱糟糟的,"他们要开动电车了":)

Neuronka 就躺在某处,如果你认真地、有心情地坐下来,就会发现工作还在,但没有心情。

 
sergeev:

我检查过了,没有区别。

在导入或导出时调用空测试也不会影响时间。

俗话说,感觉不同:

2012.01.06 16:46:28 计算器(EURUSD,H1) empty=281

2012.01.06 16:46:28 计算器 (EURUSD,H1) lib=2344

//+------------------------------------------------------------------+
//|测试。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("liba=",string(GetTickCount()-a));
   
   a=GetTickCount();
   for(int i=0; i<100000000; i++)
     {
      res=10+10;
     }
   Print("empty=",string(GetTickCount()-a));   
  }
 
Urain:

俗话说,感受不同:

不,你问的是函数调用 吧?

还是你想检查循环执行的速度?

我检查了简单函数调用和 ex5 bible 调用之间的区别。 函数调用的速度没有区别。


很明显,没有函数调用的空循环执行速度更快。

 
sergeev:

不,你问的是函数调用 吧?

还是你想检查一般的循环执行速度?

我检查了简单函数调用和 ex5 bible 调用的区别,函数调用的速度没有区别。


很明显,没有函数调用的空循环执行速度更快。

循环是相同的,在循环中执行的操作也是相同的(一种情况是直接在循环中执行,另一种情况是在函数中执行),时间上的差异给出了函数调用库的净时间。

为了实验的纯粹性,让我们直接在文件中描述一个类似的函数:

2012.01.06 17:18:39 计算器 (EURUSD,H1) empty=281
2012.01.06 17:18:38 计算器 (EURUSD,H1) lib=2281

//+------------------------------------------------------------------+
//|测试。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("liba=",string(GetTickCount()-a));
   
   a=GetTickCount();
   for(int i=0; i<count; i++)
     {
      Testlocal(0,"qwe",res,10,10,clrRed);
     }
   Print("empty=",string(GetTickCount()-a));   
  }

为了排除错误,我甚至重写了一个变量计数的循环长度,结果还是一样。

 

我有 4.5 次

2012.01.06 17:28:33 test(EURUSD,D1) ex5=2047
2012.01.06 17:28:31 test (EURUSD,D1) local=438

 
sergeev:

我有 4.5 次

2012.01.06 17:28:33 测试 (EURUSD,D1) ex5=2047
2012.01.06 17:28:31 测试 (EURUSD,D1) local=438

Alex 这样还不够吗?

这里是 4 次,这里是 2 次,等等。

如果我们开始根据圣经编写圣经,刹车就会像滚雪球一样越滚越大。

只要圣经本身不使用圣经调用,就可以使用这种方案。

 

上述示例在速度上的差异是由于在一种情况下,代码优化器对这样一个简单的函数进行了完全的过度精简,甚至完全排除了函数调用本身,而在另一种情况下,代码优化器不得不老老实实地调用外部函数

在测试中,你应该始终考虑到代码优化器不可避免的影响。在本地函数的情况下,这个循环示例会退化为 res=100;。

尝试将调用的函数变大,以避免内联,然后再次测试。