Jak zvýšit výkon zřetězení řetězce v jazyce Visual C#

Microsoft Visual JScript .NET verzi tohoto článku naleznete v 306823 .

Microsoft Visual Basic .NET verzi tohoto článku naleznete 306821 .


Tento článek odkazuje na následující obor názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.Text

V TOMTO ÚKOLU

Souhrn

Tento článek ukazuje výhody použití třídy StringBuilder nad zřetězení tradiční techniky. Řetězce v rozhraní.NET Framework jsou invariantní (odkazovaný text je jen pro čtení po počáteční přidělení). To poskytuje mnoho výhod výkonu a představuje některé problémy pro vývojáře, kteří je zvyklí na technik pro manipulaci s řetězci C/C++.

zpět na horní

Popis řetězce v rozhraní.NET Framework

Jeden technika zlepšit řetězení řetězců přes strcat() v Visual C/C++ je pole velký znak přidělit jako vyrovnávací paměť a kopírovat řetězec dat do vyrovnávací paměti. Řetězec je v rozhraní.NET Framework, neměnné. nelze jej změnit na místě. Jazyce C# + zřetězení operátor vytvoří nový řetězec a způsobuje snížený výkon, když jej spojuje velké množství textu.

Rozhraní.NET Framework však obsahuje StringBuilder třídy, která je optimalizována pro řetězení řetězců. Poskytuje stejné výhody jako pomocí pole znaků v jazyce C/C++, stejně jako automaticky rostoucí velikost vyrovnávací paměti (v případě potřeby) a sledování délka. Ukázková aplikace v tomto článku znázorňuje použití třídy StringBuilder a porovnává výkonu k zřetězení.



zpět na horní

Sestavit a spustit ukázkové aplikace

  1. Spusťte aplikaci Visual Studio a pak vytvořte nové aplikace Visual C# konzoly.
  2. Následující kód používá operátor zřetězení += a třída StringBuilder k času 5 000 zřetězení 30 znaků. Přidáte tento kód hlavní procedury.
    const int sLen=30, Loops=5000;DateTime sTime, eTime;
    int i;
    string sSource = new String('X', sLen);
    string sDest = "";
    //
    // Time string concatenation.
    //
    sTime = DateTime.Now;
    for(i=0;i<Loops;i++) sDest += sSource;
    eTime = DateTime.Now;
    Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");
    //
    // Time StringBuilder.
    //
    sTime = DateTime.Now;
    System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1));
    for(i=0;i<Loops;i++) sb.Append(sSource);
    sDest = sb.ToString();
    eTime = DateTime.Now;
    Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");
    //
    // Make the console window stay open
    // so that you can see the results when running from the IDE.
    //
    Console.WriteLine();
    Console.Write("Press Enter to finish ... ");
    Console.Read();

  3. Uložte aplikaci. Stisknutím klávesy F5 kompilovat a potom spusťte aplikaci. Okna konzoly měli zobrazit výstup podobný následujícímu:
    Zřetězení trvalo 6.208928 sekund.

    Tvůrce řetězců trvalo 0 sekund.



    Stisknutím klávesy ENTER dokončit...
  4. Stiskněte klávesu ENTER, chcete-li ukončit spuštěné aplikace a zavřete okno konzoly.
zpět na horní

Poradce při potížích

  • Pokud jsou v prostředí, které podporuje datové proudy dat, jako například ASPX webového formuláře nebo vaše aplikace zapisuje data na disk, zvažte vyhnout režii zřetězení nebo StringBuildervyrovnávací paměti a zapsat data do datového proudu přímo pomocí metody Response.Write nebo odpovídající metodu do datového proudu.
  • Zkuste znovu použít existující třída StringBuilder než přerozdělit každém potřebujete jednu. To omezuje růst haldy a snižuje uvolňování paměti. V obou případech pomocí třídy StringBuilder umožňuje efektivnější využití haldy než použití operátor +.
zpět na horní

Odkazy

Třída StringBuilder obsahuje mnoho metod pro manipulaci s řetězci v místě, které nejsou popsány v tomto článku. Další informace hledat "StringBuilder" v Online nápovědě.

zpět na horní
Vlastnosti

ID článku: 306822 - Poslední kontrola: 20. 1. 2017 - Revize: 2

Váš názor