我听过这么多次,我认为这是理所当然的。但回过头来看,有人能帮我理解为什么字符串操作,比如比较等,比说整数或其他原语更贵吗?
答案 0 :(得分:3)
8位示例:
1位可以是1或0.使用2位可以表示0,1,2和3.依此类推。 对于一个字节,您有2 ^ 8种可能性,从0到255.
在一个字符串中,一个字母存储在一个字节中,因此“Hello world”是11个字节。
如果我想做100 + 100,100存储在1字节的存储器中,我只需要两个字节来对两个数字求和。结果将再次需要1个字节。
现在让我们尝试使用字符串“100”+“100”,这是3个字节加3个字节,结果“100100”需要存储6个字节。
这过于简化,但或多或少都以这种方式运作。
答案 1 :(得分:2)
C#中的 int 数据类型经过精心挑选,与处理器设计完美匹配。哪个可以在一个cpu寄存器中存储一个int,这个存储位置比内存快3倍。并使用单个cpu指令来比较int类型的值。 CMP指令在不到一个cpu周期内运行,只需几分之一秒。
对于字符串来说,它几乎不起作用,它是可变长度数据类型,并且必须比较字符串中的每个字符以测试相等性。因此它会根据字符串的大小自动按比例减慢。此外,字符串比较受文化依赖比较规则的影响。使得“ss”和“ß”在德语中相等,“Aa”和“Å”在丹麦语中相等。没有什么微妙的处理,由CLR内部高度优化的表驱动代码处理。它无法击败CMP。
答案 2 :(得分:0)
我一直认为这是因为弦乐的不变性。也就是说,每次对字符串进行更改时,都需要为整个新字符串分配内存(而不是修改原始字符串)。
可能是一种天真的天真理解,但也许其他人可以进一步阐述。
答案 3 :(得分:0)
在查看操纵字符串的“成本”时,有几件事需要考虑。 在内存使用方面存在成本,在使用的CPU周期方面存在成本,并且存在与所涉及的代码的复杂性相关联的成本。
整数操作(加,减,Multipy,除法,比较)通常由CPU在硬件级别,少数(甚至1)指令中完成。操作完成后,答案会回放到相同大小的内存块中。
字符串存储在内存块中,必须一次操作一个字节或一个字。比较两个100个字符的长字符串可能需要100次单独的比较操作。
任何使字符串变长的操作都需要将字符串移动到更大的内存块,或者在内存中移动其他内容以允许增加现有块。
如果语言允许,任何使字符串保持相同或更小的操作都可以在适当的位置完成。如果没有,那么再次,必须分配新的内存块并移动内容。