簡體   English   中英

字符串類型 .NET 與 char 數組

[英]string type .NET vs. char array

我已經在這里工作了大約一個月的一些程序,這些程序有很多字符串解析等等。 有人建議我對這些東西使用 char 數組而不是字符串,因為 char 數組更快。 我理解為什么 char 數組很快,但它是什么讓字符串類型變慢? 它實現了什么數據結構,有什么方法可以讓它像 char 數組一樣快?

最明顯的區別是string是不可變的。 所以你不能修改它的一部分,並且需要在每次修改時創建一個全新的副本。

String 本身有一個非常特殊的實現(它是一個可變大小的類)並且沒有數組支持。 我看不出為什么對字符串中的char的只讀訪問應該很慢。

因此,如果要更改字符串的一小部分,則需要使用StringBuilderchar[] 由於StringBuilder有額外的驗證和間接,這兩個char[]更快/更快。 但由於這是一個實現細節,自從我上次測試以來它可能已經改變。


剛剛對其進行了基准測試,從 .NET 4 開始,設置char[]的成員的速度大約是StringBuilder的四倍。 但兩者都可以每秒完成超過 2 億次的任務,因此在實踐中並不重要。

char[]讀取比從string讀取稍快(我的測試代碼為 25%)。 另一方面,從StringBuilder讀取比從char[]讀取慢(3 倍)。

在所有基准測試中,我都忽略了其他代碼的開銷。 這意味着我的測試有點低估了差異。

我的結論是,雖然char[]比其他方法更快,但它僅在您每秒超過數百兆字節時才重要。


//Write StringBuilder
StringBuilder sb = new StringBuilder();
sb.Length = 256;
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    sb[j] = 'A';
}

//Write char[]
char[] cs = new char[256];
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    cs[j] = 'A';
}

// Read string
string s = new String('A',256);
int sum = 0;
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    sum += s[j];
}

//Read char[]
char[] s = new String('A',256).ToCharArray();
int sum = 0;
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    sum += s[j];
}

//Read StringBuilder
StringBuilder s= new StringBuilder(new String('A',256));
int sum = 0;
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    sum += s[j];
}

(是的,我知道我的基准代碼不是很好,但我不認為它有很大的不同。)

char arrays 優於字符串的優點是您可以更改字符 arrays ; 在 C# 中,字符串是不可變的,因此任何更改都會在堆上創建一個新的 object 並使用更改的字符串版本。 在 char 數組中,您可以進行大量更改而無需在堆上分配任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM