===============================================
2020/10/30_第1次修改 ccb_warlock
===============================================
最近参与了一次笔试中遇到了这么一个题,如下:
c#中判断变量string a是否为空字符串时(a不为null),下列哪个语法执行最快? A. a=="" B. string.IsNullOrEmpty(a) C. a.Length==0 D. a.Equals("")
虽然猜了一个C,不过我倒是从来没考虑过这个还有执行性能的差异,所以干脆写个例子测试下,结果测试下来确实差异不小。
由于次数少看不出效果,所以我将循环次数设置成10亿次。
using System; using System.Diagnostics; namespace ConsoleApp2 { class Program { static void CompareExecutedTime() { const int total = 1000000000; var str = string.Empty; var stopwatch = new Stopwatch(); stopwatch.Start(); for (var i = 0; i < total; i++) { if (str == ""){} } stopwatch.Stop(); Console.WriteLine($@"str == """" 的耗时: {stopwatch.Elapsed}"); stopwatch.Reset(); stopwatch.Start(); for (var i = 0; i < total; i++) { if (str == string.Empty){} } stopwatch.Stop(); Console.WriteLine($"str == string.Empty 的耗时: {stopwatch.Elapsed}"); stopwatch.Reset(); stopwatch.Start(); for (var i = 0; i < total; i++) { if (string.IsNullOrEmpty(str)){} } stopwatch.Stop(); Console.WriteLine($@"string.IsNullOrEmpty(str) 的耗时: {stopwatch.Elapsed}"); stopwatch.Reset(); stopwatch.Start(); for (var i = 0; i < total; i++) { if (str.Length == 0){} } stopwatch.Stop(); Console.WriteLine($"str.length == 0 的耗时: {stopwatch.Elapsed}:"); stopwatch.Reset(); stopwatch.Start(); for (var i = 0; i < total; i++) { if (str.Equals("")){} } stopwatch.Stop(); Console.WriteLine($@"str.Equals("""") 的耗时: {stopwatch.Elapsed}"); stopwatch.Reset(); stopwatch.Start(); for (var i = 0; i < total; i++) { if (str.Equals(string.Empty)){} } stopwatch.Stop(); Console.WriteLine($@"str.Equals(string.Empty) 的耗时: {stopwatch.Elapsed}"); stopwatch.Reset(); } static void Main(string[] args) { CompareExecutedTime(); } } }
执行结果如下:
结论:以string不为空为前提,判断是否为空串确实是.length的性能更优。
但很多的业务场景我们必须判断string值是否也为null,看结果IsNullOrEmpty()确实还是业务的首选项。
参考资料:
1.https://www.cnblogs.com/zhw511006/archive/2009/07/22/1528405.html
2.https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.stopwatch?view=netcore-3.1