字母比数比较慢吗?

时间:2011-01-25 20:06:21

标签: c++ algorithm

在这里忍受我。

几个月前,我记得我的算法老师与我们讨论了桶排序的实现(在我的算法书中命名为Distribution sort)以及它是如何工作的。基本上,我们不是采用面值的数字,而是通过二进制表示开始比较,如下所示:

// 32 bit integers.
Input:  9 4

4: 00000000 00000000 00000000 00000110
9: 00000000 00000000 00000000 00001001
// Etc.

并从右到左开始比较。

// First step.
4: 0
9: 1

Output: 9 4

// Second step
4: 1
9: 0

Output: 4 9 // Technically a stable algorithm, but we cannot observe that here.

// Third step

4: 1
9: 0

Output: 4 9

// Fourth step

4: 0
9: 1

Output: 9 4

就是这样;其他28次迭代都是零,因此输出不再改变。现在,比较像这样的一大串字符串

// strings
Input: "Christian" "Denis"

Christian: C h r i s t i a n
Denis:     D e n i s

// First step.
Christian: n
Denis:     s

Output: Christian, Denis

// Second step
Christian: a
Denis:     i

Output: Denis, Christian

// ... 

等等。

我的问题是,比较一个有符号的字符,一个字节数字,比比较一下更快吗?

如果我不得不假设,1字节字符比4字节整数更快。它是否正确?我可以使用wchar_t或UTF-16/32格式进行相同的假设吗?

7 个答案:

答案 0 :(得分:4)

单字节字符在C ++中作为数字进行比较。确切的速度取决于托管CPU平台,通常它与比较4字节整数的速度相同。

答案 1 :(得分:4)

你不能假设什么类型的比较更快,这取决于你的特定平台。

通常,int是CPU最“舒适”的尺寸,因此比较这些通常是最快的。任何更大的东西都可能更慢,因为它可能需要分解为多个int。任何小于可能int一样快,但根据内存架构,错误对齐的读取可能需要更长的时间。

除此之外,还有内存带宽因素。类型越大,所需带宽越高。然后就是缓存效果。如果瓶颈是CPU速度,那么这无关紧要。否则就是这样。

答案 2 :(得分:4)

在C或C ++中,char只是一个字节的整数(尽管“一个字节”可能是也可能不是8位)。这意味着在典型情况下,您必须处理的唯一区别是单字节比较是否比多字节比较更快。

至少在大多数情况下,答案是否定的。许多RISC处理器根本没有处理单个字节的指令,因此对单个字节的操作是通过将字节符号扩展为字,对字进行操作,然后(如果需要)屏蔽所有字符来执行的。单字节之外的位返回零 - 即,对整个字进行操作通常可以是单字节操作速度的三倍。

即使像x86这样直接支持单字节操作的东西,它们仍然经常变慢(在现代处理器上)。有几件事对此有所贡献。首先,使用当前模式“自然”大小的寄存器的指令比使用其他大小的指令具有更简单的编码。其次,相当数量的x86处理器具有所谓的“部分寄存器停顿” - 即使它是全部隐含的,在内部它们执行类似RISC的操作,在全尺寸寄存器上执行操作,然后将其与原始值的其他字节。例如,如果在AL中生成结果然后引用EAX,则执行序列所需的时间比在EAX中生成结果的时间要长。

OTOH,如果你看一下足够老的处理器,反过来可能(并且经常是)真的。举一个极端的例子,考虑Intel 8080或Zilog Z80。两者都有一些16位指令,但通过ALU的路径只有8位宽 - 例如,16位加法实际上是作为两个连续的8位加法执行的。如果你只能通过8位操作,它的速度大约是原来的两倍。尽管8位处理器是桌面计算机上的(远程)内存,但它们仍然在某些嵌入式应用程序中使用,所以这并不是完全过时的。

答案 3 :(得分:3)

  

我的问题是,比较一个有符号的字符,一个字节数字,比比较一下更快吗?

没有。在C ++中,这些操作的速度肯定是相同的。现代CPU对字节数进行大多数操作,无论如何都是4个 1 ,因此1字节对4字节不会减少任何计算时间。

  

请假设使用整数示例转换为二进制文件无关紧要

没有发生任何转换。无论如何,数字 在PC中表示为二进制。


1 总体简化。但是为了论证,我们可以说C ++中的int将永远是给定CPU上的“本地”度量单位。

答案 4 :(得分:1)

如果我不得不假设,1字节字符比4字节整数更快。这是对的吗?

我非常怀疑。如果我在哪里猜测,如果其中任何一个比另一个慢,那么我的下注将是相反的。原因?今天的大多数处理器都是直接使用4字节类型构建的。

我可以使用wchar_t或UTF-16/32格式进行相同的假设吗?

没有。 UTF格式涉及更多,无法直接比较,逐字节,除非您严格检查是否相等。

你真的不应该担心这种速度问题。如果你的教练教你要关注比较1字节类型和4字节类型的速度,那么你真的需要用很多盐来说明他们所说的一切。编写有效的算法,不要尝试在这个详细程度进行优化。

答案 5 :(得分:1)

正如Al Kepp所说,这取决于您的平台。但是,大多数CPU都有内置指令来比较Words,因为作为CPU指令,只要您比较的数据只适合一个单词,它就会占用相同的时间。

CMP x86 Assembly

答案 6 :(得分:1)

答案是“对齐”。比较未在自然字边界上对齐的字符将始终比比较对齐的数据慢。除此之外,处理器在管道中每个周期执行多个操作,并且许多其他条件对性能有影响。