ArrayResize
ArrayResize
函数建立新的第一维大小
int ArrayResize(
void& array[], // 引用传递的数组
int new_size, // 新数组大小
int reserve_size=0 // 保留尺寸值 (过量)
);参量
- array[]
[out] 数组变化尺寸
- new_size
[in] 第一维度新尺寸
- reserve_size=0
[in] 获得存储的分散式大小
返回值
如果执行成功,在数组中改变规格后返回所有元素计数,否则,返回-1,数组不调整大小。
如果ArrayResize() 应用于静态数组,timeseries或指标缓冲区,数组大小保持一致 这些数组将不会被重新分配。在这种情况下,如果new_size<=ArraySize(数组),函数将只会返回 new_size;否则将会返回-1值。
注释
该函数只能应用在 动态数组。应该注意的是您不能改变通过SetIndexBuffer()函数分配的作为指标缓冲区的动态数组的大小。对于指标缓冲区,调整大小的所有操作都通过程序端的运行时间子系统来执行。
数组中的元素总数不能超过 2147483647。
随着频繁的内存分配,推荐使用设置存储以减少物理内存分配数量的第三方参数。后来的ArrayResize所有调用都不能导致重新分配物理内存,只是会在保留内存内改变第一数组维度的大小。应谨记,第三方参数只能在物理内存分配期间使用。例如:
ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
ArrayResize(arr,i,1000);假若这样,内存将被重新分配两次,第一次是输入2000元素循环之前(数组大小将设为1000),第二次是i等于3000.如果我们跳过第三方参数,将会有2000重新分配物理内存,这将使程序减速。
例如:
//+------------------------------------------------------------------+
//| 脚本程序起始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 计数器
ulong start=GetTickCount();
ulong now;
int count=0;
//--- 用于快速版本维度的数组
double arr[];
ArrayResize(arr,100000,100000);
//--- 检查如何加速内存保留工作的变量
Print("--- Test Fast: ArrayResize(arr,100000,100000)");
for(int i=1;i<=300000;i++)
{
//--- 设置新数组大小指定储备100,000元素!
ArrayResize(arr,i,100000);
//--- 当到达整十整百的整数时,显示数组大小和花费的时间
if(ArraySize(arr)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
start=now;
}
}
//--- 现在显示,无保留内存的版本有多慢
double slow[];
ArrayResize(slow,100000,100000);
//---
count=0;
start=GetTickCount();
Print("---- Test Slow: ArrayResize(slow,100000)");
//---
for(int i=1;i<=300000;i++)
{
//--- 设置新的数组大小,但是无额外储备
ArrayResize(slow,i);
//--- 当到达整十整百的整数时,显示数组大小和花费的时间
if(ArraySize(slow)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
start=now;
}
}
}
//--- 脚本的示例结果
/*
Test_ArrayResize (EURUSD,H1) --- Test Fast: ArrayResize(arr,100000,100000)
Test_ArrayResize (EURUSD,H1) 1. ArraySize(arr)=100000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 2. ArraySize(arr)=200000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 3. ArraySize(arr)=300000 Time=0 ms
Test_ArrayResize (EURUSD,H1) ---- Test Slow: ArrayResize(slow,100000)
Test_ArrayResize (EURUSD,H1) 1. ArraySize(slow)=100000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 2. ArraySize(slow)=200000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 3. ArraySize(slow)=300000 Time=228511 ms
*/