20/9/2007 16:26
El Bruno
[VS2005] Strings vs StringBuilders
Buenas
después del minipost de hace unos días sobre la utilización de String.IsNullOrEmpty en el desarrollo de aplicaciones; alguien me preguntó porque String vs StringBuilders. Ya se que este no es un tema nuevo y que seguramente mucha gente lo conoce, pero para los que no estén al tanto, un consejo: "ojo con el enfoque que le dan a sus aplicaciones si tienes un proceso de cadenas string muy intensivo".
¿Porqué digo esto? porque en .Net los string son objetos rígidos, es decir, no es posible concatenar strings dentro del objeto strings. Si bien podemos utilizar la función Concat(), para cada nuevo String que procesamos, el string original se destruye y uno nuevo se crea en su lugar.
Como siempre la mejor forma de demostrarlo en con código, y para esto rescato una clase que hace muchísimo escribí para una demo:
1 class Program
2 {
3 /// <summary>
4 /// Mains the specified args.
5 /// </summary>
6 /// <param name="args">The args.</param>
7 static void Main(string[] args)
8 {
9 // 1000 operations
10 TestString(1000);
11 TestStringBuilder(1000);
12
13 // 5000 operations
14 TestString(5000);
15 TestStringBuilder(5000);
16
17 // 10000 operations
18 TestString(10000);
19 TestStringBuilder(10000);
20
21 // 50000 operations
22 TestString(50000);
23 TestStringBuilder(50000);
24
25 // 100000 operations
26 TestString(100000);
27 TestStringBuilder(100000);
28
29 Console.WriteLine("Finish process test ...");
30 Console.ReadKey();
31 }
32
33 /// <summary>
34 /// Tests the string.
35 /// </summary>
36 /// <param name="count">The count.</param>
37 public static void TestString(int count)
38 {
39 DateTime dtStart = DateTime.Now;
40 string ret = string.Empty;
41 for (int i = 0; i < count; i++)
42 {
43 ret += i.ToString();
44 }
45 DateTime dtEnd = DateTime.Now;
46 TimeSpan tsDif = dtEnd - dtStart;
47 Console.WriteLine(string.Format("For {0} operations Using Strings: {1} seconds", count, tsDif.Seconds.ToString()));
48 }
49
50 /// <summary>
51 /// Tests the string builder.
52 /// </summary>
53 /// <param name="count">The count.</param>
54 public static void TestStringBuilder(int count)
55 {
56 DateTime dtStart = DateTime.Now;
57 StringBuilder sb = new StringBuilder();
58 for (int i = 0; i < count; i++)
59 {
60 sb.Append( i.ToString() );
61 }
62 DateTime dtEnd = DateTime.Now;
63 TimeSpan tsDif = dtEnd - dtStart;
64 Console.WriteLine(string.Format("For {0} operations Using StringBuilder: {1} seconds", count, tsDif.Seconds.ToString()));
65 }
66 }
67
Como pueden ver, esta aplicación de Consola crea y concatena strings en un determinado numero de ocasiones y durante el proceso, toma los tiempos de inicio y fin para poder tener la diferencia de los mismos. El output de la consola es bastante explícito en cuando a las relaciones
For 1000 operations Using Strings: 0 seconds
For 1000 operations Using StringBuilder: 0 seconds
For 5000 operations Using Strings: 0 seconds
For 5000 operations Using StringBuilder: 0 seconds
For 10000 operations Using Strings: 0 seconds
For 10000 operations Using StringBuilder: 0 seconds
For 50000 operations Using Strings: 10 seconds
For 50000 operations Using StringBuilder: 0 seconds
For 100000 operations Using Strings: 55 seconds
For 100000 operations Using StringBuilder: 0 seconds
Finish process test ...
Saludos @ Madrid
El Bruno
Crossposting from
ElBruno.com
Archivado en: Visual Studio,VSTS
Comparte este post: