首页 / 知识
关于优化:检查字符串内容? 字符串长度vs空字符串
2023-04-12 03:50:00

Checking for string contents? string Length Vs Empty String哪种方法对编译器更有效,并且是检查字符串是否为空的最佳实践? 另外,答案是否取决于语言? 是的,这取决于语言,因为字符串存储在语言之间有所不同。
等等。
在使用C样式(以空字符结尾)字符串的语言中,与 在将长度存储为字符串对象的一部分的语言(C#,Java等)中,检查长度也是O(1)。在这种情况下,直接检查长度会更快,因为它避免了构造新的空字符串的开销。
我使用String.Empty而不是"因为"会创建一个对象,而String.Empty不会-我知道它很小而琐碎,但是当我不需要它们时,id仍然不会创建对象! (资源)
实际上,最好检查字符串中的第一个字符是否为' 0':
在Perl中,还有第三个选项,即字符串未定义。这仅与C中的NULL指针有所不同,仅是因为您不会因访问未定义的字符串而出现分段错误。 在.Net中:
字符串可以为null,因此.Length有时会引发NullReferenceException 阅读此主题后,我进行了一个小实验,得出了两个截然不同且有趣的发现。 考虑以下。
以上内容是从Visual Studio调试器的本地窗口复制的。以下三个示例中都使用相同的值。 if(strInstallString ==")=== if(strInstallString == string.Empty) 以下是这两个基本相同的情况在Visual Studio 2013调试器的反汇编窗口中显示的代码。
if(strInstallString == string.Empty)没有明显的不同
从以上由.NET Framework 4.5版的NGEN模块生成的机器代码清单中,我得出以下结论。 出于所有实际目的,针对空字符串文字和静态string.Empty属性进行的相等性测试都是相同的。这两个代码段之间的唯一区别是第一个移动指令的来源,并且两者都是相对于ds的偏移量,这意味着这两个代码段都引用了烘焙常量。 针对空字符串(如文字或string.Empty属性)进行相等性测试,以设置两个参数的函数调用,该函数调用通过返回零来指示不等式。我将这个结论基于几个月前我进行的其他测试,在这些测试中,我在托管/非托管除法和除法中遵循了自己的一些代码。在所有情况下,任何需要两个或更多参数的调用都将第一个参数放入寄存器ECX,将第二个放入寄存器EDX。我不记得随后的论点是如何通过的。但是,呼叫设置看起来更像是__fastcall而不是__stdcall。同样,期望的返回值总是显示在寄存器EAX中,这几乎是通用的。 测试字符串的长度将设置一个单参数函数调用,该函数返回1(在寄存器EAX中),恰好是被测试的字符串的长度。 鉴于立即可见的机器代码几乎完全相同,所以我能想到的唯一原因是,在Shinny报告的字符串长度上字符串相等性的性能更好,原因是执行比较的二元函数明显更好比从字符串实例读取长度的单参数函数优化。 结论 原则上,我避免将空字符串作为文字进行比较,因为空字符串文字在源代码中可能会变得模棱两可。为此,我的.NET帮助器类将空字符串长期定义为常量。尽管我使用string.Empty进行直接的内联比较,但该常量保留了定义其他值为空字符串的常量的条件,因为无法将一个常量分配给string.Empty作为其值。 本练习将一劳永逸地解决我可能对与string.Empty或助手类定义的常数进行比较的成本(如果有)的任何担忧。 但是,它也提出了一个令人困惑的问题来替代它。为什么与string.Empty比较比测试字符串的长度更有效?还是因为通过实现循环的方式,Shinny使用的测试是无效的? (我很难相信,但是话又说回来,我以前也被骗了,因为我敢肯定你也有!) 长期以来,我一直认为system.string对象被视为字符串,从根本上类似于我们早已从COM得知的已建立的Basic String(BSTR)。 假设您的问题是.NET:
如果还要验证字符串是否为空,请使用IsNullOrEmpty,如果已经知道字符串不为空,例如在检查TextBox.Text等时,请勿使用IsNullOrEmpty,然后出现问题。 我对其进行了事件测试(我也对C#进行了测试,结果相同):
结果:
这意味着比较比字符串长度检查更重要。 在Java 1.6中,String类具有一个新方法isEmpty 还有一个具有isBlank方法的Jakarta Commons库。空白定义为仅包含空格的字符串。 同样,如果不知道语言,就无法分辨。 但是,我建议您选择对随后的维护程序员最有意义并且必须维护您的工作的技术。 我建议编写一个明确执行所需功能的函数,例如
或可比。现在毫无疑问,您正在检查。 @内森
我几乎提到了这一点,但最终还是把它遗漏了,因为用空字符串调用
老实说,我一直使用 对于C字符串,
会比任何一个都快
要么
因为您将避免函数调用的开销。
@DerekPark:并非总是如此。"是一个字符串文字,因此,在Java中,几乎可以肯定它已经被嵌入。 实际上,IMO确定的最佳方法是字符串类的IsNullOrEmpty()方法。 http://msdn.microsoft.com/zh-cn/library/system.string.isnullorempty。 更新:我假设.Net在其他语言中可能有所不同。 |
最新内容
相关内容
python如何检测字符串是不是全为字
python如何检测字符串是不是全为字母?,检测,培训,字符串,字母,方法,字符,示例,语法,以上,更多,python中可以使用isalpha()方法检测字符串是不Python文件如何转换为字符串
Python文件如何转换为字符串,数据,主体,名字,培训,文件,字符串,末尾,方法,对象,语句,python文件如何转换为字符串的方法:一、最方便的方法是一python中字符串怎么转换成int
python中字符串怎么转换成int,情况,培训,字符串,浮点,错误,类型,不是,臣妾,字面,函数,将字符串转换成,整型,从字面理解很容易让人误会。比如,要python怎样计算输入的字符串的长度
python怎样计算输入的字符串的长度,培训,字符串,长度,字典,函数,列表,空格,语法,字符,实例,python中的字符串。可以使用len()函数来计算长度,python如何截断字符串
python如何截断字符串,培训,位置,字符,字符串,索引,倒数,依此类推,方括号,后面,表示,字符串本质上就是由多个字符组成的,Python允许通过索引来python字符串怎么替换
python字符串怎么替换,培训,字符串,参数,函数,方法,使用方法,语法,实例,以上,以下,python中的字符串替换,主要是使用replace()函数。replace()python是否支持字符串
python是否支持字符串,培训,数据,字符串,字符,引号,中文,内容,也就是,源程序,比如说,python要求,字符串必须使用引号括起来,可以使用单引号或者python代码中优化提速的小技巧分享
python代码中优化提速的小技巧分享,代码,培训,python字符串如何定义
python字符串如何定义,培训,数据,字符串,字符,引号,中文,内容,定义,源程序,比如说,简单地理解,字符串就是“一串字符”,也就是用引号内的任何数python字符串代表什么
python字符串代表什么,培训,数字,字符串,字符,代表,斜线,引号,中文,中间,后面,python的字符串就是表示一串字符,字符可以是中文,英文或者数字,或python字符串切片的方法是什么
python字符串切片的方法是什么,培训,字符串,索引,切片,开头,方括号,时候,方法,冒号,首尾,获取Python字符串中的某字符可以使用索引:lang=pythopython怎么查找字符串中是否包含某
python怎么查找字符串中是否包含某个字符串,培训,检测,位置,字符串,范围内,模块,索引,范围,以上,结束,python判断一个字符串是否包含另一个字