Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字母比较比数字比较慢吗?_C++_Algorithm - Fatal编程技术网

C++ 字母比较比数字比较慢吗?

C++ 字母比较比数字比较慢吗?,c++,algorithm,C++,Algorithm,请容忍我 几个月前,我记得我的算法老师和我们讨论了bucket排序的实现(在我的算法书中称为Distribution sort)及其工作原理。基本上,我们不是从表面上取一个数字,而是从二进制表示开始比较,如下所示: // 32 bit integers. Input: 9 4 4: 00000000 00000000 00000000 00000110 9: 00000000 00000000 00000000 00001001 // Etc. 从右到左开始比较 // First step

请容忍我

几个月前,我记得我的算法老师和我们讨论了bucket排序的实现(在我的算法书中称为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\u t或UTF-16/32格式做同样的假设吗 我的问题是,比较一个有符号字符,一个字节数字,比比较整数快吗

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

请假设整数示例中的二进制转换是不相关的

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



1总体简化。但是为了论证,我们可以说C++中的 INT/COD>永远是给定CPU上的“原生”度量单位。

< P>你不能假设什么类型的比较快,这取决于你的特定平台。 通常,
int
是CPU最“舒适”的大小,因此比较它们通常是最快的。任何较大的都可能较慢,因为它可能需要分解为多个
int
s。任何更小的数据都可能与
int
一样快,但根据内存体系结构的不同,错误对齐的读取可能需要更长的时间

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

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

我非常怀疑。如果我猜我的赌注在哪里,如果其中一个比另一个慢,那么我的赌注就在另一个方向上。原因?当今的大多数处理器都是为直接使用4字节类型而构建的

我可以对wchar\u t或UTF-16/32格式做同样的假设吗

不需要。UTF格式更复杂,不能直接进行逐字节比较,除非您严格检查是否相等


你真的不应该担心这种速度问题。如果你的导师教你关注比较1字节类型和4字节类型的速度,那么你真的需要对他们说的每一句话都大加保留。编写高效的算法,不要尝试在这个细节层次上进行优化。

正如Al Kepp所说,这取决于您的平台。然而,大多数CPU都有一个内置的指令来进行比较,由于它是一条CPU指令,所以只要比较的数据适合单个字,它总是占用相同的时间


答案是“对齐”。比较在自然词边界上未对齐的字符总是比比较对齐的数据慢。除此之外,处理器在流水线中每周期进行多个操作,许多其他条件对性能有影响。

< P>在C或C++中,<代码> char < /C> >只是一字节整数(虽然“一个字节”可能是或可能不是8位)。这意味着在典型情况下,唯一需要处理的区别是单字节比较是否比多字节比较快

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

即使在直接支持单字节操作的x86上,它们的速度也通常较慢(在现代处理器上)。这其中有两个原因。首先,使用大小为“自然”到当前模式的寄存器的指令比使用其他大小的指令具有更简单的编码。第二,相当多的x86处理器都有所谓的“部分寄存器暂停”——尽管这都是隐式的,但在内部,它们会像RISC一样,对全尺寸寄存器执行操作,然后将其与原始值的其他字节合并。例如,如果您在AL中生成一个结果,然后引用EAX,那么执行该序列所需的时间将比在EAX中生成结果所需的时间更长


奥托,如果你看看足够老的处理器,情况可能会相反(而且通常是这样)。对于一个极端的例子,考虑英特尔8080或ZiLog-Z80。两者都有一些16位指令,但通过ALU的路径只有8位宽——例如,16位加法实际上是作为两个连续的8位加法执行的。如果你只需要一个8位操作就可以通过,那么它的速度大约是原来的两倍。虽然8位处理器在台式机上是一个(远程)内存,但它们仍然在一些嵌入式应用程序中使用,因此这也不是完全过时。

这听起来更像基数排序,而不是桶排序,使用基数2(基数2)不是一个好主意。我喜欢你的导师采用基本的、恒定的tim