错误、漏洞、问题 - 页 2195

 
Artyom Trishkin:

来自fxsaber的问候。

我们能看到一张图片吗--它(代码)是做什么的?

 

请解释为什么ArrayResize在保留任务的情况下 非常慢?

脚本

// Добавление элемента в конец произвольного массива
template <typename T>
void AddElement( T &Array[], const T &Value, const int Reserve = 0 )
{
  const int Size = ::ArraySize(Array);

  ::ArrayResize(Array, Size + 1, Reserve);

  Array[Size] = Value;
}


#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

int Bench( const int Size, const int Reserve )
{
  const MqlTick NullTick = {0};
  MqlTick Ticks[];  
  
  for (int i = 0; i < Size; i++)
    AddElement(Ticks, NullTick, Reserve);
    
  return(ArraySize(Ticks));
}

void OnStart()
{
  BENCH(Bench(1 e7, 1 e5)); // 100 раз выделяется память
  BENCH(Bench(1 e7, 1 e6)); //  10 раз выделяется память
  BENCH(Bench(1 e7, 1 e7)); //   1 раз выделяется память
}


结果

Time[Bench(1 e7,1 e5)] = 38199494
Time[Bench(1 e7,1 e6)] = 3867983
Time[Bench(1 e7,1 e7)] = 479303


100次内存分配(5 Mb到500 Mb)需要38秒。这是否正常?

实际应用是在自定义字符中,当你想在导入前准备一个勾选历史。假设,在本地存储中有一些含有tick数据的CSV文件,你需要把它们做成一个MqlTick-array。如何以最佳方式进行?不可能事先计算出这些文件中的刻度线的数量。

 
Rashid Umarov:

我们能看到一张图片吗--它(代码)是做什么的?

 
fxsaber:

不可能事先计算出这些文件中的刻度线数量。

文件大小 除以一个勾的大致大小?

 
Andrey Khatimlianskii:

将文件大小除以一个勾的大致大小?

不幸的是,我不知道文件的大小--我是从ZIP中解压的CSV。

 
Rashid Umarov:

我们能不能看一下图片--它是做什么的?

事实证明,在选定的时间段内进行截图是很困难的--也许有一个适当的宽度定义方案来捕捉两个日期范围内的条形图?

 
Aleksey Vyazmikin:

在选定的时间段内进行截图已被证明是困难的--是否有一个适当的宽度定义方案来捕获两个日期范围内的条形图?

困难是什么?我在一个脚本中用不同的尺度做了2张截图,这样截图显示了从指定日期开始的30个柱状。


 
fxsaber:

不幸的是,我不知道文件的大小--我从ZIP中解压CSV。

他们从ZIP到哪里去?变成一个数组?对一个字符串?他们也有一个尺寸/长度。

 
Alexey Viktorov:

有什么困难?这里有一个脚本,用不同的比例做了2张截图,这样屏幕上就有了从指定日期开始的30个条形。


把变焦放到零,即使现在你也可以看到,在第二张截图中,酒吧已经很紧了,与第一张不同。

还有,30条是什么,让我们把它变成600条吧!
 
Andrey Khatimlianskii:

他们从ZIP到哪里去?变成一个数组?对一个字符串?他们也有一个尺寸/长度。

然后,我将不得不解压所有的东西,并在内存中保留数百兆字节的未打包的东西。

或者通过将字符串的数量相加来解包(字符串-勾)。节省内存。然后再次解压,但要进行解析。