【问题标题】:Array Performance/Optimization阵列性能/优化
【发布时间】:2010-12-12 06:36:54
【问题描述】:
我正在读取一个 CSV 文件,我想将结果缓存在一个数组中。
这是我的 getter/setter:
private RedirectionRule[] RedirectionRules
{
get
{
if (_redirectionRules == null)
{
return new RedirectionRule[MAXLENGTH];
}
return _redirectionRules;
}
set
{
_redirectionRules = value;
}
}
这是缓存结果的最佳方式的正确方法吗?
【问题讨论】:
标签:
c#
performance
arrays
optimization
【解决方案1】:
当_redirectionRules 是null 时,我认为在你的getter 中返回一个新数组没有多大意义。如果您在代码中设置解析 CSV 的属性,那么它将被缓存。
换句话说,你应该有一个这样的函数来解析 CSV 数据(例如,我把它放在 RedirectionRule 类中,但你可以有一个 RedirectionRuleParser 类或类似的东西取决于您的需要):
class RedirectionRule {
public static RedirectionRule Parse(string text) {
// some code here to parse text for your RedirectionRule object
}
public static RedirectionRule[] ParseCsv(string csv) {
string[] values = csv.Split(',');
RedirectionRule[] rules = new RedirectionRule[values.Length];
for (int i = 0; i < values.Length; i++) {
rules[i] = RedirectionRule.Parse(values[i]);
}
}
}
然后,如果你在某处有这样的代码,你正在缓存数据:
string csv = "RuleType1,RuleType1,RuleType1";
RedirectionRules = RedirectionRule.ParseCsv(csv);
在其他地方,您要访问已缓存的数据:
if (RedirectionRules != null) {
// do something with your cached data
} else {
// I don't know, throw an exception or something
}
您的示例代码通过在您的属性的 getter 中创建一个新的 RedirectionRule[MAXLENGTH] 数组来完成的唯一一件事就是绕过上面的 RedirectionRules != null 检查,从而打开访问看起来的数据的可能性em> 好像它被缓存了,但真的是凭空出现的。
【解决方案2】:
一般来说很难说,这取决于你到底需要什么。
另一个想法:当你在 getter 中创建一个完整大小的数组时,为什么你还需要一个 setter?可能应该只有 一个 位置创建数组,只是为了保持干净。
那么——当你创建了一次数组时,这是肯定的,为什么不在构造函数中创建它呢?
【解决方案3】:
我不确定我是否真的理解了这个问题,因为我不确定您要问以下哪个问题
- 是否可以对显示的代码进行任何优化?
- 数组是缓存结果的最佳容器吗?
- 将 csv 加载到此容器中的最佳方式是什么?
也许你问的都是三个,所以我会尽力回答所有三个
- 每次都在 getter 中检查 null 并不是最佳选择。我建议您改为在构造函数中对其进行初始化。
- 是的,数组听起来不错
- 我认为您必须提供更多信息才能完全回答这个问题。 String.Split 会将您的 csv 转换为我通常会做的字符串 []。