我正在尝试在我的程序的性能关键部分实现良好的优化。
所以我的问题是,每次因char[] abcdef
关键字而致电CountAbcdef()
时,new
是否会重新创建?我应该把它移到外面并声明为静态吗?
private static int CountAbcdef(string s)
{
var abcdef = new[] { 'a', 'b', 'c', 'd', 'e', 'f' };
return s.Count(abcdef.Contains);
}
由于
答案 0 :(得分:2)
每次运行方法时都会分配内存,而不是因为new关键字。以下方法与提供的方法具有完全相同的效果,并且没有新关键字。在方法结束时取消引用内存,因此内存影响最小。
private static int CountAbcdef(string s)
{
var abcdef = { 'a', 'b', 'c', 'd', 'e', 'f' };
return s.Count(abcdef.Contains);
}
如果要优化方法,可以将数组移到方法之外并使其保持静态。在第一次使用该类时,该阵列只会被初始化一次。要防止更改静态数组引用,请使用readonly关键字。
readonly static char[] abcdef = { 'a', 'b', 'c', 'd', 'e', 'f' };
private static int CountAbcdef(string s)
{
return s.Count(abcdef.Contains);
}
答案 1 :(得分:2)
不要在性能关键部分使用LINQ。您可以避开overhead:
private static int CountAbcdef(string s)
{
int count = 0;
foreach (char c in s)
if ( c >= 'a' && c <= 'f' )
count++;
return count;
}
答案 2 :(得分:0)
你是对的,每次用这种方式调用CountAbcdef时都会初始化数组。另一种方法是创建一个静态方法初始化的静态数组,然后Count方法可以引用预先初始化的数组。