ubuntuser napisał(a)
A czy takie wyrażenie
Console.WriteLine("tekst {0}", a);
jest lepsze aniżeli
Console.WriteLine("tekst " + a);
To pierwsze jest prawdopodobnie wolniejsze, aczkolwiek ładniejsze i częściej stosowane. Ale tak, jeśli potrzebujesz szybkości, wybierz drugie.
I czy wyrażenie
StringBuilder esbek = new StringBuilder();
double d = 123.3;
esbek.Append(d.ToString());
jest identyczne co
StringBuilder esbek = new StringBuilder();
double d = 123.3;
esbek.Append(d);
Nie pytam oczywiście o kwestie estetyczne
To trochę bardziej skomplikowane :>. Aceur, na ile go zrozumiałem, podał zupełnie błędną interpretację bo double nigdy nie da się skonwertować, jawnie czy niejawnie, do stringa.
W tym przypadku akurat rozwiązanie jest proste - StringBuilder.Append ma wiele przeciążonych wersji, czyli w jego kodzie znajdują się na przykład metody
public void Append(int i) { }
public void Append(double d) { } // !
public void Append(string s) { }
public void Append(float f) { }
etc. W wyniku tego faktycznie, nie ma prawdopodobnie różnicy w szybkości (a nawet to drugie może być szybsze).
Z drugiej strony, gdyby były tylko metody
public void Append(string s) { } // dołączamy napisy
public void Append(object o) {Append(o.ToString()); } // dołączamy wszystko inne
To różnica byłaby, i to ogromna (no, może lekko przesadzam).
Dlatego że wykonanie Append(2.0) powodowałoby kolejno:
- Stworzenie nowego obiektu typu System.Object na stercie
- Boxing zmiennej (tutaj literału) double do tego obiektu
- Wywołanie funkcji wirtualnej na strukturze (jedyna możliwość, obok Equals i GetHashCode zrobienia tego, struktury nie mogą definiować własnych funkcji wirtualnych)
- (Dodatkowe wywołanie funkcji - to akurat strata nieduża i nie wiadomo czy w ogóle takie dodatkowe wywołanie tam jest)
- W przyszłości - dodatkowa robota dla GC, bo dodatkowy stworzony obiekt trzeba zwolnić.
Myślę że dla niedużych napisów druga wersja może być 2, może 2.5 raza wolniejsza.
Dlatego czasami w miejscach krytycznych dla wydajności trzeba uważać. Rozwiązaniem tego problemu byłoby napisanie Append(2.ToString()) zamiast Append(2).