Ошибки, баги, вопросы - страница 2507

 
Vict:

Спасибо. Странно, конечно. У меня стабильная разница.

У меня тоже разницы нет.
 
fxsaber:

Получается, что при заполнении динамических массивов лучше сначала заполнять статические, а потом делать ArrayCopy в динамические.

Так и есть!

void FillArray1( int &Array[] )
{
  const int Size = ArraySize(Array);
  
  for (int i = 0; i < Size; i++)
    Array[i] = i;
}

#define ARRAY_SIZE 10000

void FillArray2( int &Array[] )
{
  int ArrayStatic[ARRAY_SIZE];
  
  const int Size = ArraySize(Array);
  
  for (int i = 0; i < Size;)
  {
    const int Size2 = i + ARRAY_SIZE < Size ? ARRAY_SIZE : Size - i;
    
    for (int j = 0; j < Size2; j++)
      ArrayStatic[j] = i++;
      
    if (Size2)
      ArrayCopy(Array, ArrayStatic, i - Size2, 0, Size2);
  }
}

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

void OnStart()
{
  int Array1[];
  ArrayResize(Array1, 1e7);

  int Array2[];
  ArrayResize(Array2, 1e7);
  
  BENCH(FillArray1(Array1));
  BENCH(FillArray2(Array2));
}
 
fxsaber:

Так и есть!

ну инициализация она обычно один раз и чаще всего на скорость можно не заморачиваться. (плюс оверхед по памяти)

а вот если идет постоянное обращение по индексам и допустим в ~99.9% случаев известен максимальный размер массива, возможно есть смысл написать свою простую обертку вокруг статического массива на замену динамическому.

 
TheXpert:

ну инициализация она обычно один раз и чаще всего на скорость можно не заморачиваться. (плюс оверхед по памяти)

У меня запись тормозит при парсинге тиков. Там их десятки миллионов, поэтому значение имеет.

а вот если идет постоянное обращение по индексам и допустим в ~99.9% случаев известен максимальный размер массива, возможно есть смысл написать свою простую обертку вокруг статического массива на замену динамическому.

Возможно, что и при чтении имеет смысл делать обертку.


ЗЫ На чтении не получилось ускориться

long ArraySum1( int &Array[] )
{
  long Sum = 0;
  
  const int Size = ArraySize(Array);
  
  for (int i = 0; i < Size; i++)
    Sum += Array[i];
    
  return(Sum);
}

#define ARRAY_SIZE 100000

long ArraySum2( int &Array[] )
{
  long Sum = 0;

  const int Size = ArraySize(Array);  
  
  int ArrayStatic[ARRAY_SIZE];  
  
  for (int i = 0; i < Size;)
  {
    const int Size2 = i + ARRAY_SIZE < Size ? ARRAY_SIZE : Size - i;

    ArrayCopy(ArrayStatic, Array, 0, i, Size2);
    
    for (int j = 0; j < Size2; j++)
      Sum += ArrayStatic[j];
      
    i += Size2;
  }
  
  return(Sum);
}

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

void OnStart()
{
  int Array[];
  ArrayResize(Array, 1e8);
  ArrayInitialize(Array, 1);
      
  BENCH(Print(ArraySum1(Array)));
  BENCH(Print(ArraySum2(Array)));
}
 
fxsaber:

Так и есть!

у меня fillarray1 чуть быстрее

а с чтением там совсем беда

 
TheXpert:

у меня fillarray1 чуть быстрее

Time[FillArray1(Array1)] = 39501
Time[FillArray2(Array2)] = 30304

Release-версию запускаю. Оптимизация включена.

 
fxsaber:

Release-версию запускаю. Оптимизация включена.

Time[FillArray1(Array1)] = 17732
Time[FillArray2(Array2)] = 18808

Хз что значит релиз - компилил по F7 (наверное это) МЕ 2085

 
TheXpert:

Time[FillArray1(Array1)] = 17732
Time[FillArray2(Array2)] = 18808

Хз что значит релиз - компилил по F7 (наверное это) МЕ 2085

ME 2093x64. F7 - Release, F5 - Debug.

 
fxsaber:

ME 2093x64. F7 - Release, F5 - Debug.

Time[FillArray1(Array1)] = 55949
Time[FillArray2(Array2)] = 62778

Build 2085.

 
Alain Verleyen:

Time[FillArray1(Array1)] = 55949
Time[FillArray2(Array2)] = 62778

Build 2085.

Возможно, в 2093 что-то поменяли.