if vs. else, unterschiedliche Performance ?

13/11/2007 - 12:46 von Matthias Bunge | Report spam
Hallo NG,


bin da auf etwas gestoßen was mir nicht so ganz einleuchtet.
(sich vielleicht ja ganz einfach erklàren làßt :-) )

Ich habe als Musterlösung einer Übungsaufgabe unserer Azubis ein kleines
Beispiel-Projekt
erstellt was den guten alten Bubble-Sort implementiert.
Am Ende wird jeweils auch die Gesamtdauer eines Sortiervorganges ausgegeben.
Innerhalb der BubbleSort-Funktion befindet sich eine if-else Bedingung
welche
im if-Fall aufsteigend bzw. im else-Fall absteigend sortiert.
Das sortieren eines Arrays mit 15000 Elementen dauert bei mir (Athlon64X2
3700+) ca. 3 Sekunden
wenn jeweils in den if verzweigt wird aber 9 (!) Sekunden wenn in den else
verzweigt wird.
Der Code im if bzw. else ist vollkommen identisch außer das im if ein if
mit einem '<' - Vergleich bzw. im else
ein if mit einem '>' - Vergleich existiert.

Das ganze habe ich VS2005 SP1/C# getestet.
Hier mal der Code :

static void BubbleSort(string AD, int[] BGWert)
{

//BubbleSort
int iAnz = BGWert.Length;
for (int i = 1; i < iAnz; i++)
{
for (int j = i; j < iAnz; j++)
{
if (AD == "A")
{
if (BGWert[i] < BGWert[j])
{
Tausche(BGWert, i, j);
}
}
else
{
if (BGWert[i] > BGWert[j])
{
Tausche(BGWert, i, j);
}
}
}
}
}

static void Tausche(int [] BGWert,int i, int j)
{

int Dummy;
Dummy = BGWert[i];
BGWert[i] = BGWert[j];
BGWert[j] = Dummy;
}

public void DoSort()
{
int[] MyArray;
int[] MySortedArray;
int[] ErgArray1;
bool bResult;
string strAnzahl;
int iAnzahl;
DateTime Startzeit;
DateTime EndZeit;
TimeSpan SortZeit;

Console.Write("Geben Sie die Größe des Arrays(Ganzzahl zwischen 1 und
50000) an: ");
strAnzahl = Console.ReadLine();
bResult = Int32.TryParse(strAnzahl, out iAnzahl);
if (bResult == false || iAnzahl <= 0 || iAnzahl > 50000)
{
Console.WriteLine ("Eingabe fehlerhaft - Programm wird beendet!");
Console.ReadLine();
return;
}
iAnzahl += 1;
MyArray = new int [iAnzahl];
Random rnd = new Random();

for (int i = 1; i < iAnzahl; i++)
{
MyArray[i] = rnd.Next(0, 1000000);
if (MyArray[0] > MyArray[i])
{
MyArray[0] = MyArray[i];
}
}

//BubbleSort
Startzeit = DateTime.Now;
BubbleSort("A",MyArray);
EndZeit = DateTime.Now;
SortZeit = EndZeit - Startzeit;

//Ergebnis
Console.WriteLine("Zeit BubbleSort in Sec.: {0}",
SortZeit.TotalSeconds);
}
 

Lesen sie die antworten

#1 Martin Horst
13/11/2007 - 14:17 | Warnen spam
Hi,

Matthias Bunge schrieb:
Hallo NG,
...



also für mich ist das ja erstmal eher ein Selectionsort als ein
Bubblesort. Aber wie dem auch sei, du füllst das Array ja mit
Zufallswerten. Ich vermute mal, daß es in dem einem if / else Zweig zu
mehr Tauschoperationen kommt, als in dem anderen. Du könntest ja mal die
Arrays mit Extremwerten initialisieren. D.h., wenn du aufsteigend
sortierst, füllst du daß Array mit absteigenden Werten und umgekehrt.
Mit den Zufallswerten kann man ja nicht wirklich eine Aussage treffen.
Oder du zàhlst einfach mal die Anzahl der Tauschoperationen.

Gruß
Martin

Ähnliche fragen