有什么办法可以让此C#代码更快? [英] Is there any way I can make this C# code faster?

查看:136
本文介绍了有什么办法可以让此C#代码更快?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我读一个大文件X12和解析内的信息。我有两个瓶颈的功能,我似乎无法变通。 read_line()和get_element()有什么办法,我可以让这两个函数更快?在get_element功能的主要瓶颈似乎是子串的方法。

 公共字符串get_element(INT将Element_number){
诠释计数= 0;
INT START_INDEX = 0;
INT END_INDEX = 0;
INT CURRENT_INDEX = 0;

,而(COUNT<将Element_number&放大器;&安培;!CURRENT_INDEX = -1){
= CURRENT_INDEX line_text.IndexOf(x12_reader.element_delimiter,START_INDEX);
START_INDEX = CURRENT_INDEX + 1;
计数++;
}

如果(CURRENT_INDEX!= -1){
END_INDEX = line_text.IndexOf(x12_reader.element_delimiter,START_INDEX);
如果(END_INDEX == -1)= END_INDEX line_text.Length;
返回line_text.Substring(START_INDEX,END_INDEX - START_INDEX);
}其他{
返回;
}
}

私人字符串read_line(){
string_builder.Clear();
INT N;
,而((N = stream_reader.Read())!= -1){
如果(N == line_terminator)返回string_builder.ToString();
string_builder.Append((char)的N);
}
返回string_builder.ToString();
}



我读X12的数据。这里是什么样子的例子。 http://examples.x12.org/005010X221/dollars-and-数据发送在一起/


解决方案

由于您的分析器告诉你 get_element 是一个瓶颈,方法本身是非常有效的编码,你需要减少的时候调用此方法的次数。



调用 get_element 反复循环的力量是重复执行相同的分析工作:

 为( INT I = 0; i = N;!我++){$​​ b $ b VAR元= get_element(I) 
... //做的元素
}
的东西

您应该可以通过重写来解决这个问题 get_element 的getElements 返回所有元素的集合,然后采取从各个元素同一集合在一个循环:

  VAR allElements =的getElements(); 
的for(int i = 0; i = N;!我++){$​​ B $ B VAR元= allElements [I]
... //做的元素
}



$ B的东西$ b

在大多数情况下,我只需要一个或两个元素




在这种情况下,你可以使检索所有必需的方法同时指标 - 例如,通过传递的 BitArray 所需的索引。


I am reading in a large file X12 and parsing the information within. I have two bottleneck functions that I can't seem to work around. read_line() and get_element() Is there any way I could make these two functions faster? The main bottleneck in the get_element function seems to be the Substring method.

    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();
    }

I am reading x12 data. Here is an example of what it looks like. http://examples.x12.org/005010X221/dollars-and-data-sent-together/

解决方案

Since your profiler tells you get_element is a bottleneck, and the method itself is coded very efficiently, you need to minimize the number of times this method is called.

Calling get_element repeatedly in a loop forces it to performs the same parsing job repeatedly:

for (int i = 0 ; i != n ; i++) {
    var element = get_element(i);
    ... // Do something with the element
}

You should be able to fix this problem by rewriting get_element as GetElements returning all elements as a collection, and then taking individual elements from the same collection in a loop:

var allElements = GetElements();
for (int i = 0 ; i != n ; i++) {
    var element = allElements[i];
    ... // Do something with the element
}

in most cases I only need one or two elements

In this case you could make a method that retrieves all required indexes at once - for example, by passing BitArray of required indexes.

这篇关于有什么办法可以让此C#代码更快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆