1

次のように、スペースまたはコンマで区切られた一連の実数で構成されるSystem.Stringがあります。

"645.974,255.478 645.973,255.468 645.97 0 233.54 21"

文字列を解析し、リストにその番号を入力したいと考えています。このタスクを実行する最も速い方法を見つけようとしています。これまでのところ、二重のリストを持ち、文字列を10万回解析して、次の方法を試しました。

List<double> MyList = new List<double>(250);
  • 正規表現: ~8.56[s]

    MyList.Clear();
    
    foreach (Match match in RgxDouble.Matches(Points))
            MyList.Add(double.Parse(match.Value));
    
  • C++/CLI を使用したアンマネージ コード: ~7.5[s]

    static void UsingUnmanagedCode(wchar_t* points, List<double> ^MyList)
    {
        static char buffer[MAX_CHARS];
        wcstombs(buffer, points, MAX_CHARS);
        char *start = buffer, *ptr = buffer;
    
        for(; *ptr; ++ptr)
        {
            if(*ptr == ',')
                *ptr = ' ';
        }
    
        while(*(--ptr) == ' ')
            *ptr = '\0';
    
        char *pEnd;
        MyList->Add(strtod(start, &pEnd));
    
        while(*pEnd)
        {
            char *pStart = pEnd;
            MyList->Add(strtod(pStart, &pEnd));
        }
    }
    
  • C# とStringBuilderを使用した安全でないコード: ~2.4[s]

    MyList.Clear();
    
        fixed (char* fixPointsPtr = Points)
        {
            char* ptr = fixPointsPtr;
    
            while (*ptr != '\0')
            {
                if ((*ptr < '0' || *ptr > '9') && *ptr != '-' && *ptr != '.')
                {
                    MyList.Add(double.Parse(strBuild.ToString(0, strBuild.Length), NumberStyles.AllowDecimalPoint));
                    strBuild.Length = 0;
                }
    
                else
                    strBuild.Append(*ptr);
    
                ++ptr;
            }
        }
    
  • 文字列分割: ~2[s]

    MyList.Clear();
    
    foreach (string point in Points.Split(Separators, StringSplitOptions.RemoveEmptyEntries))
            MyList.Add(double.Parse(point, NumberStyles.AllowDecimalPoint));
    

より良い代替手段はありますか?

4

1 に答える 1

3

プログラムの設計を評価して、速度が重要な場合に文字列を「オンザフライ」で分割できるかどうかを確認することをお勧めします。

たとえば、文字列はどのようにしてプログラムに組み込まれますか?アルゴリズムを非常に効率的にするには、(私が知る限り)最善の策は、操作を単一のループに凝縮しようとすることです...単一のループは複数のループよりも自動的に高速です。これを行う簡単な方法は、データが入ってくるときに文字ごと、バイトごとに「リッスン」し、有効な実数があることに気づいたらすぐにリストに追加することです。

于 2012-04-21T18:12:55.143 に答える