向#define专家提问 - 页 11

 
Igor Makanu:

如果物理上在CPU命令中,没有

阵列是一个存储区域,对阵列元素的访问是从这个存储区域的开始计算一个元素的索引,并根据存储类型检索数据(字节)。


如果这是算法的逻辑,那么是的,它们是可索引变量。

一般来说,在所研究的问题上,唯一正确的建议是https://www.mql5.com/ru/forum/354662/page4#comment_19039624。

     {
      for(int i=0; i<ArraySize(mas); i++)
        {  
        r2+=ArraySize(mas);
        r2|=ArraySize(mas); 
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        if (r2>10) r2|=sizem; 
        }
     } 

二进制操作的执行时间比if语句的执行时间快很多倍(应该是这样)....看起来幕后要么是干净的,要么是超快的本地代码

上面那个的时间是下面那个的一半。


严格来说,我们是在比较两个变量))。

 
Alexandr Andreev:

二进制操作的执行时间比if语句的执行时间快很多倍(应该如此)....

循环中不应该有if(),早期的循环是由CX寄存器执行的。

Alexandr Andreev:

上层的时间是下层的一半

我不是在讨论,我早上又在测试,时间优化在MQL5中总是有效的,结果取决于循环的数量,嗯,哪个测试先被调用--我不会再测试了,这是浪费时间

 
Igor Makanu:

循环中不应该有if(),在循环被执行之前,CX case

我不是在讨论,我早上又在测试,时间优化在MQL5中总是有效的,结果取决于循环的数量,好在哪个测试先被调用,我不会再测试了,这是在浪费时间

....你需要注意你的帖子)))),上面的帖子是指建议ArraySize 操作符检查超限的帖子(这是你的if),通过把它加到正文中才是真正的检查,而这是唯一正确的方法。

而与运行第一个的区别只在你的测试中)

 
Alexandr Andreev:

而与运行第一个的唯一区别是在你的测试中)

给我你的测试,让我们看看。

虽然...不需要,我是在参与关于自动化的讨论,你喜欢,我对在循环终止条件中使用ArraySize() 有不同的看法。

 

.ex5尺寸

void OnStart() // размер 12 272 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер 11 860 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0; i < ArraySize(arr) - 1; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер  12 174 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
 
除了编译器的制作者,谁知道呢?也许ArraySize() 就像变量引用一样工作。这似乎是可能的。
 
Dmitry Fedoseev:
而除了编译器的创造者,谁知道呢?也许ArraySize()的工作原理就像对一个变量寻址一样。这似乎是可能的。
void OnStart()
  {
   int mas[];  
   int size=1000000000;
   ArrayResize(mas,size); 
   int r2=0; 
   int tr=0;  
    int num_steps=ArraySize(mas); 
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
    
  // for(ulong z=0; z<max; z++)
  
   int sizem=Size(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        r2|=sizem; 
        }
     } 
   ulong t2=GetMicrosecondCount(); 
     {
      for(int i=0; i<Size(mas); i++)
        {  
        r2+=Size(mas);
        r2|=Size(mas); 
        } 
     }  
   ulong t3=GetMicrosecondCount();
   
  Print(t2-t1," ",t3-t2," ",r2) ; 
  }
 
int Size(int &mas[]){return Size2(mas);} 
int Size2(int &mas[]){return Size3(mas);} 
int Size3(int &mas[]){return ArraySize(mas);} 

请注意,这里调用 ArraySize的函数和速度之间的测试是相同的,什么访问只是一个变量。因为编译器只是展开了它们

ArraySize

使用ArraySize() 的权宜之计有不同的看法。


和重新排列没有区别
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 

另一个测试来自the_bald....

为什么你要对你的创作进行一次测试?

至少测试10次,看看会发生什么

包裹在外部循环代码中,结果。

HQ 0 15:26:55.230 tst (EURUSD,H1) 558620 543908 -512

RO 0 15:28:08.672 tst (EURUSD,H1) 544176 543129 -512

EF 0 15:28:09.759 tst (EURUSD,H1) 544139 543144 -512

RM 0 15:28:10.847 tst (EURUSD,H1) 544174 543436 -512

GD 0 15:28:11.934 tst (EURUSD,H1) 543668 543531 -512

CR 0 15:28:13.021 tst (EURUSD,H1) 543413 543097 -512

JI 0 15:28:14.107 tst (EURUSD,H1) 543046 543218 -512

HP 0 15:28:15.194 tst (EURUSD,H1) 543337 543469 -512

PO 0 15:28:16.282 tst (EURUSD,H1) 543602 544455 -512

KE 0 15:28:17.369 tst (EURUSD,H1) 543253 543197 -512

CL 0 15:28:18.457 tst (EURUSD,H1) 544199 543664 -512

我不会重新安排测试的循环,我对上面的代码大小感到厌烦,这意味着很好的优化,也许用代码分析器,去年我很惊讶,在MQL4的iCustom优化中--4个调用4=x个指标缓冲区 被替换成一个调用,在某个地方有一个主题,还是关于效率的。

总的来说,Metacquotes在分析用户的类型代码方面做得很好,也就是说,编译器会自己修复用户的大部分东西......很酷,我认为

 

对不起,我可能是错的。我还没有全部读完。只有第一页。印象中的情况与往常一样。有人问了一个具体的问题。然后,洪水猛兽就会扑过来。

再次抱歉,这真的是一个开发者论坛吗 ?????

 
Сергей Таболин:

对不起,我可能是错的。我还没有全部读完。只有第一页。印象中的情况与往常一样。有人问了一个具体的问题。然后,洪水猛兽就会扑过来。

再次抱歉,这真的是一个开发者论坛吗 ?????

错了,那里也提出了其他问题,与TC的问题不同。而了解汇编的原则有时会有帮助。

原因: