2009-11-05 16 views
6

Czy kompilator zoptymalizuje sformatowane ciągi, czy też będzie działał wolniej niż ciągi, które nie są podzielone w czytelny sposób?Dosyć formatu sql w kodzie .NET, wydajność?

np

string sql = 
    "select * " + 
    "from person " + 
    "where id = :id"; 

lub

string sql = "select * from person where id = :id"; 

To tylko mały przykład. Wiesz, jak skomplikowany może być sql.

+3

Kompilator niewątpliwie zoptymalizuje ciąg podczas kompilacji programu, aby był równy w wykonywanym kodzie. – Lazarus

+2

Dlaczego przesyłasz odpowiedzi jako komentarze? –

+0

Możliwe duplikaty: http://stackoverflow.com/questions/627643/sql-formatowanie-tool –

Odpowiedz

13

Wystarczy użyć: -

string sql = 
    @"select * 
    from person 
    where id = :id"; 

Jest to z punktu widzenia identycznego kompilatory do jednego rozwiązania liniowego. Chociaż nie zdziwiłbym się, gdyby udało mi się zobaczyć konkatenację łańcuchów literalnych zoptymalizowanych przez kompilator. Jednak pospolitym podejściem z podejściem konkatenacji jest zapominanie o włączaniu białych znaków na końcu łańcucha.

+1

Świetna wskazówka na temat użycia "@". Użyłem ampersandu dla wielu innych "rzeczy ciągów", ale nigdy nie wiedziałem, że to działa dla rzeczy wielowierszowych! – kaze

+1

Należy pamiętać, że ze składnią "@", jak pokazano, otrzymasz inny ciąg niż w oryginale: wszystkie karetki, linie i dodatkowe białe znaki zostaną uwzględnione. Zatem twój ciąg będzie "wybierz * \ r \ n od osoby \ r \ n gdzie id =: id". W tym przypadku nie ma to większego znaczenia, ale w niektórych przypadkach różnica jest ważna. –

+0

StackOverflow usunął dodatkowe spacje z mojego poprzedniego komentarza. Po każdym "\ r \ n" powinno być pięć spacji. –

7

Można użyć

string s = @"SELECT * 
FROM person 
WHERE id = :id"; 
+0

+1 za dopuszczenie, aby ciąg "skleił" w lewo zamiast wcięcia kolejnych linii. – Kleinux

6

Stałe łańcuchowe są składane w czasie kompilacji tak dwa fragmenty kodu powyżej są zasadniczo identyczne.

Czy to dobry pomysł, aby mieć wbudowany SQL ciąg jest zupełnie inna sprawa ...

+0

To prawda, że ​​w moim przypadku często nie mam wyboru, ale używam wbudowanego SQL, więc chcę po prostu jak najlepiej wykorzystać sytuację. – kaze

+0

+1 dla "złożonego" – Dan

6

Ah - jeden z odwiecznych prawd C#. Co jest lepsze, kod łączący łańcuchy za pomocą + lub kodu, który nie działa? W twoim przypadku odpowiedź zależy od wersji .NET, której używasz .NET1 może zoptymalizować ciąg znaków + tylko w jednym wyciągu. Zbyt duża liczba + w jednym ciągu powodowała gorszą wydajność, ponieważ kompilator musiał uciekać się do tworzenia nowych instancji napisów, aby poradzić sobie z dodatkowymi częściami łańcuchowymi. Z architektury .NET 2 architektura uległa niewielkiej zmianie, a wiele instrukcji + komplikuje się dość płynnie przez kompilator.

+2

Dzięki za spóźnienie - ktokolwiek to zrobił. Wyjaśnij, dlaczego uważasz, że ta odpowiedź jest błędna, aby każdy mógł się z niej uczyć. –

10

Można to sprawdzić za pomocą prostego programu:

Console.WriteLine("a" + "b"); 

Korzystanie reflector, można łatwo zdemontować wynikowy plik binarny. W trybie zwolnienia IL generuje:

L_0000: ldstr "ab" 
L_0005: call void [mscorlib]System.Console::WriteLine(string) 

Tak .NET optymalizuje "dość sformatowane łańcuchy".

+0

Świetna odpowiedź :) –

Powiązane problemy