TheXpert: Uma matriz dinâmica tem mais verificações, Renat uma vez escreveu, não consigo encontrar o post, apenas falando sobre o acesso ao índice, porque é significativamente mais lento do que as vantagens
Acontece que ao encher arrays dinâmicos, é melhor primeiro encher arrays estáticos, e depois fazer ArrayCopy a arrays dinâmicos.
Fez uma matriz dinâmica a partir de uma matriz estática. Daí todos os problemas de tipo resultantes:
int a[][100];
ArrayResize(a, 100);
ZeroMemory(a);
// Первый цикл
for(int i; i < 100; ++i)
{
for(int n; n < 100; ++n)
{
a[i][n]++;
}
}
// Второй цикл
for(int n; n < 100; ++n)
{
for(int i; i < 100; ++i)
{
a[i][n]++;
}
}
Quando o primeiro e segundo loops funcionam a velocidades diferentes.
A iniciação bem sucedida é normalmente uma coisa única e na maioria das vezes não tem de se preocupar com a velocidade. (mais despesas gerais de memória)
Mas se houver um acesso de índice constante e por exemplo em ~99,9% dos casos o tamanho máximo da matriz é conhecido, provavelmente faz sentido escrever a sua própria embalagem simples em torno da matriz estática para substituir a dinâmica.
A inicialização é normalmente uma coisa única e na maioria das vezes não é preciso preocupar-se com a velocidade. (mais despesas gerais de memória).
Tenho um recorde de desaceleração na análise de carrapatos. Há dezenas de milhões deles, por isso é importante.
Mas se houver uma referência constante por índices e por exemplo em ~99,9% dos casos o tamanho máximo de matriz é conhecido, provavelmente faz sentido escrever a sua simples embalagem em torno de matriz estática em vez de dinâmica.
Pode fazer sentido fazer um embrulho também na leitura.
SZZ Em leitura, não consigo obter qualquer aceleração.
long ArraySum1( int &Array[] )
{
long Sum = 0;
constint Size = ArraySize(Array);
for (int i = 0; i < Size; i++)
Sum += Array[i];
return(Sum);
}
#define ARRAY_SIZE 100000long ArraySum2( int &Array[] )
{
long Sum = 0;
constint Size = ArraySize(Array);
int ArrayStatic[ARRAY_SIZE];
for (int i = 0; i < Size;)
{
constint 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) \
{ \
constulong _StartTime = GetMicrosecondCount(); \
A; \
Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - _StartTime)); \
}
voidOnStart()
{
int Array[];
ArrayResize(Array, 1 e8);
ArrayInitialize(Array, 1);
BENCH(Print(ArraySum1(Array)));
BENCH(Print(ArraySum2(Array)));
}
Tive a ideia original (o primeiro código não contava correctamente os endereços). Se não se importar, será interessante ver o resultado consigo.
Varia muito de corrida para corrida, não se nota a diferença de um lado para o outro. Claro, estou a executar a versão Release.
Uma matriz dinâmica tem mais verificações, Renat uma vez escreveu, não consigo encontrar o post, apenas falando sobre o acesso ao índice, porque é significativamente mais lento do que as vantagens
Acontece que ao encher arrays dinâmicos, é melhor primeiro encher arrays estáticos, e depois fazer ArrayCopy a arrays dinâmicos.
O que causa este abrandamento?
Fez uma matriz dinâmica a partir de uma matriz estática. Daí todos os problemas de tipo resultantes:
Quando o primeiro e segundo loops funcionam a velocidades diferentes.
Obrigado. É estranho, é claro. Tenho uma diferença estável.
Obrigado. É estranho, é claro. Tenho uma diferença estável.
Acontece que ao encher arrays dinâmicos, é melhor primeiro encher arrays estáticos, e depois fazer ArrayCopy a arrays dinâmicos.
Assim é!
E é!
A iniciação bem sucedida é normalmente uma coisa única e na maioria das vezes não tem de se preocupar com a velocidade. (mais despesas gerais de memória)
Mas se houver um acesso de índice constante e por exemplo em ~99,9% dos casos o tamanho máximo da matriz é conhecido, provavelmente faz sentido escrever a sua própria embalagem simples em torno da matriz estática para substituir a dinâmica.
A inicialização é normalmente uma coisa única e na maioria das vezes não é preciso preocupar-se com a velocidade. (mais despesas gerais de memória).
Tenho um recorde de desaceleração na análise de carrapatos. Há dezenas de milhões deles, por isso é importante.
Mas se houver uma referência constante por índices e por exemplo em ~99,9% dos casos o tamanho máximo de matriz é conhecido, provavelmente faz sentido escrever a sua simples embalagem em torno de matriz estática em vez de dinâmica.
Pode fazer sentido fazer um embrulho também na leitura.
SZZ Em leitura, não consigo obter qualquer aceleração.
E é!
o meu fillarray1 é ligeiramente mais rápido
e a leitura é uma confusão.
o meu fillarray1 é ligeiramente mais rápido
A versão de lançamento está a correr. Optimização activada.