有什么方法我可以使这个c#代码更快
本文关键字:代码 什么 方法 我可以 可以使 | 更新日期: 2023-09-27 18:04:49
我正在读取一个大文件X12并解析其中的信息。我有两个瓶颈函数,我似乎无法解决。read_line()和get_element()是否有办法使这两个函数更快?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/
由于您的分析器告诉您get_element
是一个瓶颈,并且该方法本身的编码非常有效,因此您需要最小化该方法的调用次数。
在循环中重复调用get_element
强制它重复执行相同的解析工作:
for (int i = 0 ; i != n ; i++) {
var element = get_element(i);
... // Do something with the element
}
您应该能够通过将get_element
重写为GetElements
返回所有元素作为集合,然后在循环中从同一集合中获取单个元素来解决此问题:
var allElements = GetElements();
for (int i = 0 ; i != n ; i++) {
var element = allElements[i];
... // Do something with the element
}
在大多数情况下,我只需要一个或两个元素
在这种情况下,您可以创建一个方法来一次检索所有所需的索引—例如,通过传递所需索引的BitArray
。
好的,再试一次。由于性能原因而放弃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();
}
我不确定你到底在做什么,但如果我正确理解你的代码,不会得到元素更简单如下?
public string get_Element(int index)
{
var elements = line_text.Split(new[] { x12_reader.element_delimiter });
if (index > elements.Length)
return "";
return elements[index];
}