Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Assembly 将字符串转换为整数需要多少CPU周期?_Assembly_Cpu Speed - Fatal编程技术网

Assembly 将字符串转换为整数需要多少CPU周期?

Assembly 将字符串转换为整数需要多少CPU周期?,assembly,cpu-speed,Assembly,Cpu Speed,这取决于字符串的长度,因此让我们考虑3种情况:最简单的情况、最坏的情况和中间的情况。全部用于32位无符号整数。值将为0、4294967295和67295(半长字符串) 假设它在现代CPU上运行,比如i7 Nehalem 我想用具体的数字来说明这个操作的CPU密集程度。该算法通常是一个小循环,其中一次迭代需要上一次迭代的结果,因此代码不会利用超级调用CPU优化 在现代CPU上执行此操作是否有硬接线指令 编辑:我试着回答自己并做了一些搜索 使用并从中编码 第一条和最后一条指令运行一次。其他延迟和执行

这取决于字符串的长度,因此让我们考虑3种情况:最简单的情况、最坏的情况和中间的情况。全部用于32位无符号整数。值将为0、4294967295和67295(半长字符串)

假设它在现代CPU上运行,比如i7 Nehalem

我想用具体的数字来说明这个操作的CPU密集程度。该算法通常是一个小循环,其中一次迭代需要上一次迭代的结果,因此代码不会利用超级调用CPU优化

在现代CPU上执行此操作是否有硬接线指令

编辑:我试着回答自己并做了一些搜索

使用并从中编码

第一条和最后一条指令运行一次。其他延迟和执行的总和是每次迭代18次。所以这个问题的答案应该是4+18*string.length

  • “0”=22个周期
  • “4294967295”=184个循环
  • “67295”=94次循环
这比我想象的要少得多。这只是为了转换,并不计算处理字符串所需的所有操作:从NIC缓冲区复制到ram,从ram复制到CPU缓存


我算对了吗?是否有任何微观优化专家可以告诉我这看起来是否正确?(可能是神秘的?;)

将字符串转换为整数值的算法是公认的算法(32位)。但是,将整数值转换为字符串的算法不止一种(更不用说指令集、微体系结构、缓存大小等了)。即使你限制了每一件事,这个问题也没有一个单一的答案

尽管如此,我认为这可能是过早优化的情况。如果我理解正确,您关心的是非二进制协议引入的额外开销。二进制协议通常是提高性能的极端措施。通常,这样做也是为了限制延迟,而不是增加吞吐量


在使用二进制协议时被迫放弃的文本协议有很多好处(压缩特性、易用性、易调试性等)。还需要考虑的是,并非所有的CPU架构都是小端字节(网络字节顺序是特定的大字节)。在优化之前,请确保协议是瓶颈。

解释XML文件的内容会消耗大量CPU周期。大的解析需要CPU秒或更长的时间。如果将大型XML文件保留为值数据库,仅查找数据平均要比将数据转换为这种或那种数字格式花费数百万倍的时间

因此,(如果可能的话)将文件一次性转换为向量、矩阵或其他二进制值结构,您可以轻松地将其索引到其中。如果不可能建立索引,那么在向量中查找数据将比在XML文件中查找数据快得多。在任何情况下,即使是在一次性转换中,在XML文件中查找数据的任务也比找到数据后进行转换要大得多


至于你的问题本身,我猜每个循环10(更接近)到15个循环。我曾读到,loop[cond]指令是早期处理器的遗留物,在引入奔腾时可能已经不再有用了。gcc的程序集输出确认很少使用它。据我所知,这与指令不容易重新排序有关,而且它测试的状态标志在指令开始执行时可能不可用,从而导致处理器暂停。但是,它的结果(跳转)应该是相当可预测的。

@Cratylus:关于如何将字符串转换为int,有很多问题,但它不计算CPU周期(sub、mul、add的周期数…)计算机使用字节,字符串是为人类使用的。转换所需的时间无关紧要,它总是比所需的I/O快得多。目前有4种不同的i7基础架构(Nehalem、Sandy Bridge、Ivy Bridge、Haswell,不包括Haswell-E),另外两种已经演示过(Broadwell、Skylake)。你的问题太笼统了。如何找到答案很容易。测量一下。@HansPassant今天在Web服务器上完成的大多数转换都是针对XML和JSON序列化的。浏览器/Web服务消费者前端服务器SQL数据库。我想知道为什么这个问题值得投反对票。
;parameters esi is a pointer to the string, ecx the length of the string
string_to_int:       ; 
xor ebx,ebx          ; clear ebx                    > 1,1
.next_digit:
movzx eax,byte[esi]  ;                              > 1,1
inc esi              ;                              > 1,1
sub al,'0'           ; convert from ASCII to number > 1,1
imul ebx,10          ;                              > 1,3
add ebx,eax          ; ebx = ebx*10 + eax           > 1,1
loop .next_digit     ; while (--ecx)                > 6
mov eax,ebx          ;                              > 1,1
ret