有什么办法可以让此C#代码更快?

编程入门 行业动态 更新时间:2024-10-08 04:34:18
本文介绍了有什么办法可以让此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的数据。这里是什么样子的例子。 examples.x12/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. examples.x12/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#代码更快?

本文发布于:2023-11-29 15:45:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1646837.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:更快   代码   有什么办法可以

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!