0

大きなファイル X12 を読み込んで、その中の情報を解析しています。回避できないボトルネック関数が 2 つあります。read_line() と get_element() これら 2 つの関数を高速化する方法はありますか? get_element 関数の主なボトルネックは Substring メソッドのようです。

    public String get_element(int element_number) {
        int count = 0;
        int start_index = 0;
        int end_index = 0;
        int current_index = 0;

        while (count < element_number && current_index != -1) {
            current_index = line_text.IndexOf(x12_reader.element_delimiter, start_index);
            start_index = current_index + 1;
            count++;
        }

        if (current_index != -1) {
            end_index = line_text.IndexOf(x12_reader.element_delimiter, start_index);
            if (end_index == -1) end_index = line_text.Length;
            return line_text.Substring(start_index, end_index - start_index);
        } else {
            return "";
        }
    }

    private String read_line() {
        string_builder.Clear();
        int n;
        while ((n = stream_reader.Read()) != -1) {
            if (n == line_terminator) return string_builder.ToString();
            string_builder.Append((char)n);
        }
        return string_builder.ToString();
    }

x12 データを読み取っています。これがどのように見えるかの例です。http://examples.x12.org/005010X221/dollars-and-data-sent-together/

4

3 に答える 3

1

わかりました、2 回目の試行。String.Splitパフォーマンス上の理由で破棄すると、次のようなものは実装よりもはるかに高速に動作するはずです。

//DISCLAIMER; typed in my cell phone, not tested. Sure it has bugs but you should get the idea.
public string get_element(int index)
{
     var buffer = new StringBuilder();
     var counter = -1;

     using (var enumerator = text_line.GetEnumerator())
     {
         while (enumerator.MoveNext())
         {
             if (enumerator.Current == x12_reader.element_delimiter)
             {
                 counter++;
             }
             else if (counter == index)
             {
                 buffer.Append(enumerator.Current);
             }
             else if (counter > index)
                 break;
        }
     }

     return buffer.ToString();
}
于 2016-08-30T14:36:29.537 に答える