有什么办法可以让此C#代码更快? [英] Is there any way I can make this C# code faster?
问题描述
我读一个大文件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
asGetElements
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屋!