?
Blackshadow schrieb:
Was ist, wenn die Größe des Spielfeldes erst zur Laufzeit festgelegt werden soll?
Da mußt Du zwangsläufig new verwenden.
@junix:
Joe_M. schrieb:
...eine kleine Testroutine schreiben.
Bin doch schon dazu gekommen. Allerdings mit dem Ergebnis, dass sich bei keinerlei Perfomanceunterschiede ergeben...
// Testroutinen (nur 3 Buttons und 3 Labels auf einem Form und die 3 Variablen aus der OnCreate im Header deklarieren):
void __fastcall TForm1::FormCreate(TObject *Sender)
{
max_zeilen = 10;
max_spalten = 10;
loop_count = 1000000;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;
int test;
int start;
int ende;
int** DatenMatrix = new int*[max_zeilen];
for (int z = 0; z < max_zeilen; z++)
DatenMatrix[z] = new int[max_spalten];
for (int z = 0; z < max_zeilen; z++)
{
for (int s = 0; s < max_spalten; s++)
{
DatenMatrix[z][s] = (z * max_spalten) + s + 1;
}
}
start = GetTickCount();
for (int loop = 0; loop < loop_count; loop++)
{
for (int z = 0; z < max_zeilen; z++)
for (int s = 0; s < max_spalten; s++)
test = DatenMatrix[z][s];
}
ende = GetTickCount();
Label1->Caption = AnsiString(ende - start);
for (int i = 0; i < max_zeilen; i++)
delete[] DatenMatrix[i];
delete[] DatenMatrix;
Button1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Button2->Enabled = false;
int* pDatenMatrix;
int test;
int start;
int ende;
int* DatenMatrix = new int[max_zeilen * max_spalten];
pDatenMatrix = DatenMatrix;
for (int z = 0; z < max_zeilen; z++)
{
for (int s = 0; s < max_spalten; s++)
{
*pDatenMatrix = (z * max_spalten) + s + 1;
pDatenMatrix++;
}
}
start = GetTickCount();
for (int loop = 0; loop < loop_count; loop++)
{
pDatenMatrix = DatenMatrix;
for (int z = 0; z < max_zeilen; z++)
{
for (int s = 0; s < max_spalten; s++)
{
test = *pDatenMatrix;
pDatenMatrix++;
}
}
}
ende = GetTickCount();
Label2->Caption = AnsiString(ende - start);
delete[] DatenMatrix;
Button2->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Button3->Enabled = false;
int test;
int start;
int ende;
int DatenMatrix[10][10];
for (int z = 0; z < max_zeilen; z++)
for (int s = 0; s < max_spalten; s++)
DatenMatrix[z][s] = (z * max_spalten) + s + 1;
start = GetTickCount();
for (int loop = 0; loop < loop_count; loop++)
{
for (int z = 0; z < max_zeilen; z++)
{
for (int s = 0; s < max_spalten; s++)
{
test = DatenMatrix[z][s];
}
}
}
ende = GetTickCount();
Label3->Caption = AnsiString(ende - start);
Button3->Enabled = true;
}
//---------------------------------------------------------------------------
Vielleicht ist dieses Testszenario auch einfach nicht geeignet um die Performance zu testen... Irgendwelche Anregungen oder Erklärungen, junix?
EDIT:
Ich habe das jetzt mal mit QueryPerformance Counter gemessen:
LARGE_INTEGER start, ende, frequenz;
start.QuadPart = 0;
ende.QuadPart = 0;
QueryPerformanceFrequency(&frequenz);
QueryPerformanceCounter(&start);
// ein Schleifendurchlauf
QueryPerformanceCounter(&ende);
LabelX->Caption = AnsiString(((double) ende.QuadPart - (double) start.QuadPart) / (double) frequenz.QuadPart);
Hierbei ergibt sich das (von mir) erwartete Bild. Die Methode unter Button1 ist schneller. Ergebnisse (AMD Athon XP 2400, Array 1500 * 500, 1 Schleifendurchlauf):
Button1: 0,0007615...
Button2: 0,0011317...
Button3: 0,0011317...
Die Ergebnisse variieren bei jedem Durchlauf etwas, aber die Relation bleibt idenntisch. Offensichtlich ist GetTickCount nicht genau genug.