string type .NET vs. char array

后端 未结 2 342
闹比i
闹比i 2021-01-11 14:47

I\'ve been working with some programs here at work for about a month now that have a lot of string parsing and such going on. I\'ve been advised to use a char array for thi

相关标签:
2条回答
  • 2021-01-11 15:08

    The most obvious difference is that string is immutable. So you can't modify parts of it and need to create a completely new copy on each modification.

    String itself has a very special implementation (it's a variable size class) and is not backed by an array. I see no reason why read-only access to chars in a string should be slow.

    So if you want to change small parts of a string, you need to use either StringBuilder or char[]. Of these two char[] is/was faster since StringBuilder has additional verifications and indirections. But since this is an implementation detail it might have changed since I last tested it.


    Just benchmarked it, and as of .NET 4 setting a member of char[] is about four times as fast compared to a StringBuilder. But both can do more than 200 milion assignments per second, so it rarely matters in practice.

    Reading from a char[] is slightly faster (25% for my test code) that reading from string. Reading from StringBuilder on the other hand is slower (a factor of 3) than reading from char[].

    In all benchmarks I neglected the overhead of my other code. This means that my test underestimates the differences a bit.

    My conclusion is that while char[] is faster than the alternatives it only matters if you're going over hundreds of megabytes per second.


    //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];
    }
    

    (Yes, I know my benchmark code isn't very good, but I don't think it makes a big difference.)

    0 讨论(0)
  • 2021-01-11 15:16

    The advantage with char arrays over strings is that you can alter character arrays in place; in C# strings are immutable, and so any change creates a new object on the heap with a changed version of the string. In a char array you can make lots of changes without allocating anything on the heap.

    0 讨论(0)
提交回复
热议问题