Albireo
Legacy Member
Ik was in m'n design patterns boek code tegengekomen om te timen hoelang een methode erover doet om afgehandeld te worden en die wou ik eens uitproberen. En omdat ze altijd zeggen om StringBuilder te gebruiken i.p.v. string als je veel bewerkingen op die string moet uitvoeren heb ik eens getest hoelang het duurt om 1 000 000 char's aan mekaar te plakken; 1 keer met StringBuilder.Append en 1 keer met String+=
resultaat
- via String: 982591ms (16 minuten)
- via StringBuilder: 54ms
(voor het geval iemand nog moest twijfelen aan het nut van StringBuilder)
resultaat
- via String: 982591ms (16 minuten)
- via StringBuilder: 54ms
Code:
RandomWordCreator creator = new RandomWordCreator();
creator.Length = 1000000;
Console.WriteLine(ShowTimerCommand.TimeThis(new Command(creator.Create)).TotalMilliseconds);
Console.WriteLine(ShowTimerCommand.TimeThis(new Command(creator.CreateString)).TotalMilliseconds);
Code:
public class RandomWordCreator {
private static readonly char[] charset=new char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
private string randomword;
private int length;
public int Length {
set {
this.length = value;
}
}
public string RandomWord {
get {
return this.randomword;
}
}
public void Create() {
this.randomword=CreateRandomWord(this.length);
}
public void CreateString() {
this.randomword = CreateRandomString(this.length);
}
public static string CreateRandomWord(int length) {
StringBuilder sb = new StringBuilder(length);
Random rnd=new Random();
for (int i = 0; i < length; i++) {
sb.Append(RandomWordCreator.charset[rnd.Next(26)]);
}
return sb.ToString();
}
public static string CreateRandomString(int length) {
string sb="";
Random rnd = new Random();
for (int i = 0; i < length; i++) {
sb+=(RandomWordCreator.charset[rnd.Next(26)]);
}
return sb;
}
}
public delegate void Command();
public class ShowTimerCommand {
public static void Snooze() {
System.Threading.Thread.Sleep(2000);
}
public static TimeSpan TimeThis(Command c) {
DateTime t1 = DateTime.Now;
c.Invoke();
return DateTime.Now.Subtract(t1);
}
}
(voor het geval iemand nog moest twijfelen aan het nut van StringBuilder)
.
(en dan heb je nog temp vars en zo).
