Tjena. jag har inte gjort några prestanda tester på det där men lite info kan du få .. Trash hade gjort lite tester och enligt honom var alternativ 1 snabbast och 2 långsammast.Snabbast loop?
Vill ju hålla lite liv i det här forumet så jag tänkte kolla om nån vet om och i såfall hur stor skillnad det är att loopa igenom en ArrayList på lite olika sätt:
1, använda en vanlig for dvs for(int i=0;i<array.Count;i++)
2, använda foreach(string hej in array)
3, använda for(IEnumerator iter=array.GetEnumerator();iter.MoveNext())
Eller är det kanske nån annan konstruktion...
/Johan - alltid undrandeSv: Snabbast loop?
för det första är typ 2 och 3 exakt samma, enda skillnaden är att du gör det mauellt istället för att språket gör det åt dig..
vad gäller hur den accessar så har enumerator varianten en intern index som den iterer igenom för varje movenext du använder ...
skulle inte tro att det skiljer speciellt mycket dem emellan ...
Däremot är inte variant 2 och 3 möjliga att förändra, då objekten som kommer tillbaka är sk Immutable ... Sv: Snabbast loop?
Han kan kanske själv redogöra för eventuella testresultat.
/Johan
-------------------------------------
Gjorde själv ett litet testprogram enlig följande:
<code>
Console.WriteLine("Enter number of turns");
int j=int.Parse(Console.ReadLine());
ArrayList list=new ArrayList(j);
int i;
for(i=0;i<j;i++)
{
list.Add(i.ToString());
}
DateTime first=System.DateTime.Now;
for(i=0;i<j;i++)
{
string tmp=list[i].ToString();
}
TimeSpan ts = DateTime.Now.Subtract(first);
Console.Out.WriteLine("(For)Total time: " + ts.TotalMilliseconds.ToString());
first=System.DateTime.Now;
for(IEnumerator iter=list.GetEnumerator();iter.MoveNext();)
{
string tmp=iter.Current.ToString();
}
ts = DateTime.Now.Subtract(first);
Console.Out.WriteLine("(For enumerator)Total time: " + ts.TotalMilliseconds.ToString());
first=System.DateTime.Now;
foreach(string tmp in list)
{
string tmp2=tmp;
}
ts = DateTime.Now.Subtract(first);
Console.Out.WriteLine("(Foreach)Total time: " + ts.TotalMilliseconds.ToString());
</code>
Resultatet blev enlig följande:
j=100 000<br>
(For)Total time: 20,0288
(For enumerator)Total time: 30,0432
(Foreach)Total time: 30,0432
<br>
j=300 000<br>
(For)Total time: 60,0864
(For enumerator)Total time: 80,1152
(Foreach)Total time: 80,1152
<br>
j=500 000<br>
(For)Total time: 90,1296
(For enumerator)Total time: 140,2016
(Foreach)Total time: 140,2016
<br>
j=700 000<br>
(For)Total time: 140,2016
(For enumerator)Total time: 200,288
(Foreach)Total time: 180,2592
<br>
j=900 000<br>
(For)Total time: 170,2448
(For enumerator)Total time: 250,36
(Foreach)Total time: 250,36
<br>
Det som jag tyckte var intressant var att helt plötsligt så tog IEnumerator konsruktionen längre tid...upplevde detta under flera test. Vet inte om GC:en satte in samtidigt eller vad. Men slutsatsen blir enlig följande: har du under 100 000 strängar spelar det kvitta. Annars använd For eller om du måste foreach