0
点赞
收藏
分享

微信扫一扫

C#简单性能提升


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()​​的重载方法

C#简单性能提升_sed

  • 一般用法

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}");
}

测试结果,显而易见,使用字符数组的方式效率要高很多

C#简单性能提升_算法_02

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);
}

}

上述写法,我们的程序抛出了一个空引用异常

C#简单性能提升_sed_03

  • 不使用​​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);
}
}

换了思路后,我们的程序输出了我们定义的结果

C#简单性能提升_算法_04

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() 方法进行字符串的拼接

C#简单性能提升_List_05

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​​属性耗时更少

C#简单性能提升_算法_06

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}");
}

节省了除第一次以外,获取数组长度的时间,提升了一定的效率

C#简单性能提升_sed_07


测试结果存在一定误差,参考便好


举报

相关推荐

0 条评论