Features of the mql5 language, subtleties and tricks - page 264

 
Vladimir Pastushak #:

It's not quite clear here.

How much memory to allocate, how to calculate?

   int start_mem = TerminalInfoInteger(TERMINAL_MEMORY_USED);
   double arr[];
   ArrayResize(arr,1,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 8 Mb
   ArrayResize(arr,1,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 9 Mb
   ArrayResize(arr,1000000,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 9 Mb
   ArrayResize(arr,1000001,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 9 Mb
   ArrayResize(arr,1000002,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 16 Mb
   ArrayResize(arr,2000000,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 16 Mb
   ArrayResize(arr,2000001,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 16 Mb
   ArrayResize(arr,2000002,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 16 Mb
   ArrayResize(arr,2000003,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 24 Mb

It's a strange picture.
I don't understand why first 8 and then 9.
I also don't understand why memory is expanded for the second time when the second parameter = 1000002 and not 1000001. And the third time at the second parameter = 2000003 and not at 2000001 or 2000002.

 
Nikolai Semko #:
I also don't understand why the memory is expanded for the second time when the second parameter = 1000002 and not 1000001.

Forum on trading, automated trading systems and testing trading strategies

Peculiarities of mql5 language, subtleties and techniques of work

Nikolai Semko, 2024.06.06 01:49

   int start_mem = TerminalInfoInteger(TERMINAL_MEMORY_USED);
   double arr[];
   ArrayResize(arr,1,1 e6);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 8 Mb
 

Here the physical size is 1e6 + 1, not 1e6. That is, you have 1 element + 1e6 in reserve.

The reserve is enough up to and including 1000001.

I could be wrong, but most likely I'm not

 
Vladislav Boyko #:

Here the physical size is 1e6 + 1, not 1e6. That is, you have 1 element + 1e6 in reserve.

The reserve is enough up to and including 1000001.

I could be wrong, but I'm probably not wrong

you are wrong.
since the minimum step is 1 million, this experiment will be more correct:

   int start_mem = TerminalInfoInteger(TERMINAL_MEMORY_USED);
   double arr[];
   ArrayResize(arr,1,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 76 Mb
   ArrayResize(arr,1,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 76 Mb
   ArrayResize(arr,1000000,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 76 Mb
   ArrayResize(arr,1000001,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 76 Mb
   ArrayResize(arr,1000002,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 76 Mb
   ArrayResize(arr,2000000,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 76 Mb
   ArrayResize(arr,2000001,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 76 Mb
   ArrayResize(arr,10000001,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 76 Mb
   ArrayResize(arr,10000002,1 e7);
   Print(string(TerminalInfoInteger(TERMINAL_MEMORY_USED)-start_mem)+" Mb");   // 153 Mb

now you can see that you are wrong

strange, why 76 Mb and not 80 ?!!
 
Nikolai Semko #:
strange, why 76 Mb and not 80 ?!

Forum on trading, automated trading systems and testing trading strategies

How to find out the reserved memory of a dynamic array?

Laszlo Tormasi, 2024.01.04 08:36 AM

Use MQLInfoInteger to get the memory used by the script directly instead of terminal memory used.

MQLInfoInteger(MQL_MEMORY_USED)
 
Nikolai Semko #:
wrong
#define _printMemUsed(text) Print(text, " = ", MQLInfoInteger(MQL_MEMORY_USED), "Mb")

void OnStart()
  {
   _printMemUsed("start");
   double arr[];
   ArrayResize(arr, 1 e6);
   _printMemUsed("1e6 + 0");
   ArrayFree(arr);
   ArrayResize(arr, 1 e6, 1 e6);
   _printMemUsed("1e6 + 1e6");
  }
start = 0 Mb
1 e6 + 0 = 8 Mb
1 e6 + 1 e6 = 16 Mb

What's the difference between

ArrayResize(arr, 1 e6, 1 e6);

и

ArrayResize(arr, 1, 1 e6);

?

Why should it work differently ?

 
Vladislav Boyko #:

hmm...
but now the picture is like this. Better, but still not clear why 77 and not 80

   int start_mem = MQLInfoInteger(MQL_MEMORY_USED);
   double arr[];
   ArrayResize(arr,1,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 77 Mb
   ArrayResize(arr,1,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 77 Mb
   ArrayResize(arr,1000000,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 77 Mb
   ArrayResize(arr,1000001,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 77 Mb
   ArrayResize(arr,1000002,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 77 Mb
   ArrayResize(arr,2000000,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 77 Mb
   ArrayResize(arr,2000001,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 77 Mb
   ArrayResize(arr,10000001,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 77 Mb
   ArrayResize(arr,10000002,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");  // 154 Mb
With uchar array, the picture is as follows (which is as plausible as possible):

10 Mb
11 Mb
11 Mb
11 Mb
11 Mb
11 Mb
11 Mb
11 Mb
20 Mb
and with int the picture is as follows:
39 Mb
39 Mb
39 Mb
39 Mb
39 Mb
39 Mb
39 Mb
39 Mb
77 Mb
riddles
 
Nikolai Semko #:

you are wrong.
since the minimum step is 1 million, this experiment will be more correct:

now you can see that you are wrong

strange, why 76 Mb and not 80 ?!!

I don't know why for 1000001 and 1000002 you have the same now. I have everything as expected:

#define _printMemUsed(text) Print(text, " = ", MQLInfoInteger(MQL_MEMORY_USED), "Mb")

void OnStart()
  {
   _printMemUsed("start");
   double arr[];
   ArrayResize(arr, 1, 1 e6);
   _printMemUsed("[1, 1e6]");
   ArrayResize(arr, 1 e6 + 1, 1 e6);
   _printMemUsed("[1e6 + 1, 1e6]");
   ArrayResize(arr, 1 e6 + 2, 1 e6);
   _printMemUsed("[1e6 + 2, 1e6]");
  }
start = 0 Mb
[1, 1 e6] = 8 Mb
[1 e6 + 1, 1 e6] = 8 Mb
[1 e6 + 2, 1 e6] = 16 Mb
 
Nikolai Semko #:

hmm...
but now the picture is like this. Better, but still not clear why 77 and not 80

And where are you launching from? Probably start_mem is not zero because there is something else in the programme besides the code you are publishing.

Type start_mem too
 
Vladislav Boyko #:

I don't know why for 1000001 and 1000002 you have the same now. It's as expected for me:

I think it is the work of MQLInfoInteger(MQL_MEMORY_USED) and TerminalInfoInteger(TERMINAL_MEMORY_USED) that is to blame.

 
Vladislav Boyko #:

Where are you launching from? Probably start_mem is not zero because there is something else in the programme besides the code you are publishing.

Type in start_mem too.

I'm running from an empty script

void OnStart() {
   int start_mem = MQLInfoInteger(MQL_MEMORY_USED);
   int arr[];
   ArrayResize(arr,1,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,1,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,1000000,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,1000001,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,1000002,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,2000000,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,2000001,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,10000001,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,10000002,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,20000002,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,20000003,1 e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
}