buc*_*h11 8 string comparison integer
整数和字符串如何在较低级别进行比较?就像我们使用时一样
int a = 11;
int b = 12;
compare(a,b); //Just an example comparison, not in any particular language.
Run Code Online (Sandbox Code Playgroud)
和
String a = "11";
String b = "12";
compare(a,b);
Run Code Online (Sandbox Code Playgroud)
现在我要问的是这两个比较之间的系统级差异是什么?问题不适用于任何特定语言,它只是一个普遍的问题.它也不是关于字符串到整数的转换/比较,反之亦然.我知道不同平台和不同语言的答案可能有所不同,但由于我对此没有任何线索,我只是问一个通用的问题.
为什么整数比较总是被认为比字符串比较更快?
ssu*_*ube 12
通常,字符串或整数(最简单的形式)是逐字节比较的.
因此对于int示例,它将成为单CPU指令:
cmp a, b
Run Code Online (Sandbox Code Playgroud)
哪个运行速度相当快(假设32位整数,32位或更好的处理器).这是一个适合CPU寄存器的比较.
但是,字符串更复杂.最简单的看起来像:
foreach ( character c in string a, character d in string b )
cmp c, d
Run Code Online (Sandbox Code Playgroud)
并且必须逐个字符地遍历整个字符串.如果字符串具有不同的长度,则必须处理它(显然,整数都是相同的大小).
在更复杂的级别,使用区域设置和各种字符集,每个字符串字符可以是2-4个字节,并且尽管具有不同的字节值,但是一些字符(具有重音符号等)可以比较为彼此相等.涉及更多的处理和处理,更多的工作几乎总是意味着更慢.
确切的行为因区域设置,字符集和语言而异.某些语言(例如,C#)存储具有长度的字符串,而其他语言(C)仅存储字符数组.其他语言可以设计用于字符串处理或具有优化的库来处理它,这可以降低成本.
有趣的是,从理论上讲,使用ASCII字符串时,比较3个字符或更少字符的字符串可能与比较int的速度大致相同.在这种情况下,它更多地涉及所涉及的内存量(strcmp对于ASCII可以在memcmp内部使用,这大约是==将要使用的内容).对于在开头存储字符串长度的语言和0长度(空)字符串,这也可能适用,因为它们可以简单地比较长度(可以是int).
| 归档时间: |
|
| 查看次数: |
8888 次 |
| 最近记录: |