C#简单性能提升
- 1、String Split()
- 2、String Equals()
- 3、Adding Strings()
- 4、List.Count() Vs List.Any() Vs List.Count
- 5、Array Length
1、String Split()
- 在C#中,共有10个
Split()
的重载方法
- 一般用法
static void SplitChar()
{
var str = "Hello|World";
// 实例化秒表对象
var s1 = new Stopwatch();
s1.Start();
_ = str.Split('|');
Console.WriteLine($"SplitChar ElapsedTicks:{s1.ElapsedTicks}");
}
- 优化写法创建一个字符数组并将它们作为参数传递到
Split()
方法
static void SplitCharArray()
{
var str = "Hello|World";
// 实例化秒表对象
var s1 = new Stopwatch();
s1.Start();
_ = str.Split(new char[] { '|' });
Console.WriteLine($"SplitCharArray ElapsedTicks:{s1.ElapsedTicks}");
}
测试结果,显而易见,使用字符数组的方式效率要高很多
2、String Equals()
- 检查
str
变量的值是否等于字符串“Akshay”
,而且,不知道是什么原因,str
的值为null
static void Equals1()
{
try
{
string str = null;
Console.WriteLine(str.Equals("Hello World") ? "IF" : "ELSE");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
上述写法,我们的程序抛出了一个空引用异常
- 不使用
str
的Equals()
方法,而是使用“Akshay”
的Equals()
方法
static void Equals2()
{
try
{
string str = null;
Console.WriteLine("Hello World".Equals(str) ? "IF" : "ELSE");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
换了思路后,我们的程序输出了我们定义的结果
3、Adding Strings()
- 对字符串插值(string interpolation),字符串格式化(string format),字符串连接(string concat)和字符串构建器(striing builder)进行基准测试
static void AddStrings()
{
string str = "Hello";
string str1 = "World";
var s1 = new Stopwatch();
//String Interploation
s1.Start();
_ = $"{str} {str1} is an author";
Console.WriteLine($"String Interpolation {s1.ElapsedTicks}");
//String Format
s1.Restart();
_ = string.Format("{0},{1} is an author", str, str1);
Console.WriteLine($"String Format {s1.ElapsedTicks}");
//String Concat
s1.Restart();
_ = string.Concat(str, str1, " is an auther");
Console.WriteLine($"String Concat {s1.ElapsedTicks}");
//StringBuilder
s1.Restart();
StringBuilder sb = new StringBuilder();
sb.Append(str);
sb.Append(str1);
sb.Append(" is an auther");
_ = sb.ToString();
Console.WriteLine($"StringBuilder {s1.ElapsedTicks}");
}
四种不同的方法来添加两个字符串拼接起来,四种方法中string.Concat()
用时最少
根据测试结果建议使用 string.Concat()
方法进行字符串的拼接
4、List.Count() Vs List.Any() Vs List.Count
- 在迭代之前,使用
List.Count()
方法来检查lib是否有数据或者是否为空。在这里比较List.Count()
和List.Any()
方法的执行时间
static void ListCountAndAny()
{
var watch = new Stopwatch();
var strs = new List<string>()
{
"Hello",
"World",
"CSahrp",
"Years"
};
watch.Start();
if (strs.Count() > 0) { }
Console.WriteLine($"List.Count() {watch.Elapsed}");
watch.Restart();
if (strs.Any()) { }
Console.WriteLine($"List.Any() {watch.Elapsed}");
watch.Restart();
if (strs.Count > 0) { }
Console.WriteLine($"List.Count {watch.Elapsed}");
}
Count()
方法比Any()
方法节省时间。但是直接使用Count
属性耗时更少
5、Array Length
- 开发人员倾向于在for循环中使用
Array.Length
作为迭代的条件,但需要我们知道的是,每次迭代都会调用Length
属性。最好将其存储在变量中并将该变量作为迭代条件
数组长度直接作为迭代条件
static void ArrayLengthInLoop()
{
var watch = new Stopwatch();
string[] names = new[] { "Akshay", "Patel", "Panth" };
watch.Start();
for (int i = 0; i < names.Length; i++) { }
Console.WriteLine($"Array.Length in the Loop: {watch.Elapsed}");
}
数组长度,存储在变量中,将该变量作为迭代条件
static void ArrayLengthInVariable()
{
var watch = new Stopwatch();
string[] names = new[] { "Akshay", "Patel", "Panth" };
watch.Start();
int k = names.Length;
for (int i = 0; i < k; i++) { }
Console.WriteLine($"Array.Length in a Variable: {watch.Elapsed}");
}
节省了除第一次以外,获取数组长度的时间,提升了一定的效率
测试结果存在一定误差,参考便好