用于进行有效的基于LZ77的数据解压缩的技术的制作方法

文档序号:11161949阅读:496来源:国知局
用于进行有效的基于LZ77的数据解压缩的技术的制造方法与工艺

本申请要求于2014年9月24日提交的题为“TECHNOLOGIES FOR EFFICIENT LZ77-BASED DATA COMPRESSION(用于进行有效的基于LZ77的数据解压缩的技术)”的美国实用新型专利申请序列号14/494,766的优先权。



背景技术:

软件数据解压缩是许多计算应用(包括服务器应用和客户端应用两者)中使用的重要软件操作。许多常见的无损压缩格式基于LZ77压缩算法。使用基于LZ77的算法所压缩的数据通常包括符号流。每一个符号可以包括要复制到输出或参考中以便重复已经解压缩的数据的文字量数据。相比如DEFLATE等其他无损压缩算法,基于LZ77的算法通常实现更低的压缩级别但提供更高的性能,特别是对于解压缩。一种典型的基于LZ77的格式是由谷歌公司开发且由Apache HadoopTM项目等使用的“Snappy”。其他基于LZ77的格式包括LZO和LZF。

解压缩算法的典型实施方式包括用于对输入符号进行分类的众多条件分支。那些条件分支的结果取决于输入数据。用于典型处理器的分支预测硬件可能难以正确地预测那些条件分支的结果。分支误预测惩罚可能降低可实现的解压缩性能。

附图说明

在附图中通过示例的方式而非限制的方式来展示了本文中所描述的概念。为了说明的简单和清晰起见,附图中所展示的元件不一定按比例绘制。在认为适当的情况下,在附图当中重复参考标号以表示相应或相似的元件。

图1是用于有效数据解压缩的计算设备的至少一个实施例的简化框图;

图2是图1的计算设备的环境的至少一个实施例的简化框图;

图3A和图3B是可由图1和图2的计算设备执行的用于有效数据解压缩的方法的至少一个实施例的简化流程图;

图4是可以通过图3A和图3B的方法来解压缩的压缩数据符号的示意图;

图5是图3A和图3B的方法的至少一个实施例的伪代码清单;以及

图6是图3A和图3B的方法的一部分的另一个实施例的伪代码清单。

具体实施方式

虽然本公开的概念易于经历各种修改和替代形式,但是在附图中已经通过示例的方式来示出了其特定实施例并且将在本文中对其进行详细描述。然而,应当理解的是,不意在将本公开的概念限制于所公开的特定形式,而相反,意图是覆盖与本公开和所附权利要求书一致的所有修改型式、等效型式和替代型式。

在说明书中提到“一个实施例”、“实施例”、“示意性实施例”等表明所描述的实施例可以包括特定特征、结构、或特性,但每一个实施例可能或可能不一定包括该特定特征、结构、或特性。此外,这种短语不一定指相同的实施例。进一步地,当关于实施例而描述特定特征、结构或特性时,应当认为的是,无论是否进行了明确描述,结合其他实施例来实现这种特征、结构或特性都在本领域的技术人员的知识内。另外,应当理解的是,包括在采用“A、B和C中的至少一者”的形式的列表中的项目可以指(A);(B);(C);(A和B);(A和C);(B和C);或(A、B、和C)。类似地,采用“A、B或C中的至少一者”的形式来列出的项目可以指(A);(B);(C);(A和B);(A和C);(B和C);或(A、B和C)。

在一些情况下,可以在硬件、固件、软件或其任何组合中实施所公开的实施例。还可以将所公开的实施例实施为由瞬态或非瞬态机器可读(例如,计算机可读)存储介质承载或者存储在其上的可由一个或多个处理器来读取和执行的指令。机器可读存储介质可以被具体化为任何存储设备、机制、或用于存储或传输采用机器可读形式的信息的其他物理结构(例如,易失性或非易失性存储器、介质盘或其他介质设备)。

在附图中,一些结构特征或方法特征可能以特定安排和/或顺序示出。然而,应当理解的是,可能不需要这种特定安排和/或顺序。相反,在一些实施例中,可以采用与在说明性附图中所示出的方式和/或顺序不同的方式和/或顺序来安排这种特征。另外,在具体的图中包括结构特征或方法特征并不意味着暗示在所有实施例中都需要这种特征,并且在一些实施例中,可以不包括这种特征或者这种特征可以与其他特征组合。

现在参照图1,用于进行有效数据解压缩的说明性计算设备100包括处理器120、I/O子系统122、存储器124、和数据存储设备126。在使用时,如以下所描述的,计算设备100被配置成用于从压缩输入数据中读取符号,对所述符号进行解码,以及输出解压缩数据。计算设备100判定是否可以使用快速通路解压缩例程或使用传统缓慢通路解压缩例程来解压缩每一个输入符号。可以使用快速通路例程来解压缩大多数符号,并且由此可由处理器120的分支预测硬件高准确性地预测对是否应用快速通路例程的确定。在执行快速通路例程期间,计算设备100在不执行可能无法使用分支预测硬件来预测的数据相关分支指令的情况下确定要复制的数据的起始地址和长度。再次,计算设备100可以在不执行数据相关分支指令的情况下使用小数据表或其他快速的技术来确定下一符号在输入流中的位置。通过避免不可预测的分支指令,计算设备100可以避免分支误预测惩罚。通过减小用于确定下一符号位置的关键指令路径的执行时间,计算设备100可以提高吞吐量,特别是在使用能够进行无序执行的处理器120时。说明性地,如在本文中所描述的计算设备100可以实现的解压缩速度比之前已知的、优化的软件解压缩技术快50-100%。

计算设备100可以被具体化为能够进行有效数据解压缩并且以其他方式执行本文中所描述的功能的任何类型的设备。例如,计算设备100可以被具体化为(不限于)膝上型计算机、笔记本计算机、平板计算机、智能电话、移动计算设备、可穿戴计算设备、计算机、台式计算机、工作台、服务器计算机、分布式计算系统、多处理器系统、消费者电子设备、智能家电、和/或能够进行有效数据解压缩的任何其他计算设备。如在图1中所示出的,说明性计算设备100包括处理器120、I/O子系统122、存储器124、和数据存储设备126。当然,在其他实施例中,计算设备100可以包括其他或附加部件,如计算机中常见的部件(例如,各种输入/输出设备)。另外,在一些实施例中,说明性部件中的一个或多个说明性部件可以结合在另一部件中,或以其他方式形成其一部分。例如,在一些实施例中,存储器124或其部分可以结合在处理器120中。

处理器120可以被具体化为能够执行本文中所描述的功能的任何类型的处理器。例如,处理器120可以被具体化为(多个)单核或多核处理器、数字信号处理器、微控制器、或者其他处理器或处理/控制电路。类似地,存储器124可以被具体化为能够执行本文中所描述的功能的任何类型的易失性或非易失性存储器或数据储存设备。在操作中,存储器124可以存储在对计算设备100的操作期间所使用的各种数据和软件,比如,操作系统、应用、程序、库、和驱动程序。存储器124经由I/O子系统122通信地耦合至处理器120,所述子系统可以被具体化为用于促进与计算设备100的处理器120、存储器124、以及其他部件的输入/输出操作的电路和/或部件。例如,I/O子系统122可以被具体化为或以其他方式包括用于促进输入/输出操作的存储器控制器中枢、输入/输出控制中枢、固件设备、通信链路(即,点到点链路、总线链路、线、电缆、光导、印刷电路板迹线等)和/或其他部件和子系统。在一些实施例中,I/O子系统122可以形成片上系统(SoC)的一部分并且可以与计算设备100的处理器120、存储器124以及其他部件一起结合在单个集成电路芯片上。

数据存储设备126可以被具体化为被配置成用于对数据进行短期或长期存储的任何类型的一种或多种设备,如例如,存储器设备和电路、存储器卡、硬盘驱动器、固态驱动器或其他数据存储设备。数据存储设备126可以存储计算设备100处理的压缩和/或解压缩数据。

计算设备100还可以包括通信子系统128,所述通信子系统可以被具体化为能够使计算设备100与其他远端设备之间通过计算机网络(未示出)的通信成为可能任何通信电路、设备、或其集合。通信子系统128可以被配置成用于使用任何一种或多种通信技术(例如,有线或无线通信)以及相关联的协议(例如,以太网、WiMAX等)来实现这种通信。

现在参照图2,在说明性实施例中,计算设备100在操作期间建立环境200。说明性实施例200包括输入模块202、符号标签解码模块204、数据源模块206、输出模块208、和缓慢通路模块210。在使用时,计算设备100被配置成用于从输入流212中读取压缩数据、对所述压缩数据进行解码、以及将解压缩数据写入输出流214中。环境200的各种模块可以被具体化为硬件、固件、软件或其组合。例如,环境200的各种模块、逻辑和其他部件可以形成计算设备100的处理器120或其他硬件部件的一部分或以其他方式由所述计算设备的所述处理器或所述其他硬件部件建立。

输入模块202被配置成用于管理对输入流212的访问。输入模块202被配置成用于打开输入流212并从输入流212中读取符号和其他数据。输入模块202可以维持输入流指针,所述输入流指针可以用于访问来自输入流212的压缩数据。输入流212可以被具体化为包括压缩数据的任何存储器内数据结构。输入流212可由文件、网络连接、存储器缓冲器、或压缩数据的任何其他来源支持或以其他方式与其相关联。

符号标签解码模块204被配置成用于基于输入模块202读取的符号标签值来确定下一符号增量值、文字量增量值、数据长度和偏移量值。如以上所描述的,压缩数据包括符号系列。每一个符号可以是文字量符号或参考符号,并且每一个符号可以在输入流212中占据可变数量的字节。文字量符号包括在解压缩期间要复制到输出流214中的文字量数据。参考符号指在解压缩期间要复制到输出流214中的之前解压缩的数据,例如,通过复制之前复制到输出流214中的数据。下一符号增量值可以用于标识下一符号的开头在输入流212中的位置。对于文字量符号和参考符号两者,数据长度指示要复制多少数据字节。文字量增量值可以用于定位文字量数据在输入流212中的起点,并且偏移量值可以用于定位参考数据在输出流214中的起点。在一些实施例中,符号标签解码模块204可以被配置成用于通过分别对下一符号增量表216、文字量增量表218和长度表220进行索引来确定下一符号增量值、文字量增量和数据长度。另外地或可替代地,在一些实施例中,符号标签解码模块204可以被配置成用于以编程方式确定那些值。

数据源模块206被配置成用于维持源指针,所述源指针用于访问要复制到解压缩输出中的数据。数据源模块206被配置成用于基于当前符号的类型(即,文字量符号或参考符号)来将源指针设置成指向来自输入流212的文字量数据或者参考来自输出流214的之前解压缩的数据。数据源模块206被配置成用于在不执行任何可预测分支指令的情况下例如通过使用条件移动指令来设置源指针。

输出模块208被配置成用于管理对输出流214的访问。输出模块208被配置成用于打开输出流214并将解压缩数据写入输出流214中。输出模块208还被配置成用于允许从用于解压缩参考符号的输出流214中复制已经写入的数据。输出模块208可以维持输出流指针,所述输出流指针可以用于从输出流214中读取和/或写入解压缩数据。输出流214可以被具体化为能够存储和参考解压缩数据的任何存储器内数据结构。输出流214可由文件、网络连接、存储器缓冲器、或任何其他解压缩数据目的地支持或以其他方式与其相关联。

缓慢通路模块210被配置成用于执行缓慢通路解压缩例程以便对快速通路(即,输入模块202、符号标签解码模块204、数据源模块206、和输出模块208)无法解码的符号进行解码。缓慢通路解压缩例程可以被具体化为能够对快速通路无法解码的符号进行解码的任何经优化或未经优化的解压缩算法,如例如,谷歌公司开发的Snappy解压缩库。例如,缓慢通路解压缩例程可以基于当前符号的类别而包括不可预测的分支指令。

现在参照图3A,在使用时,计算设备100可以执行用于进行有效数据解压缩的方法300。方法300开始于框302,在所述框中,计算设备100打开输入流212并将输入流指针设置到包括在所述流中的第一符号。计算设备100可以使用任何技术来打开输入流212,比如,将文件的内容复制到存储器缓冲器中或者对文件进行存储器映射。对于许多文件格式,输入流212可以包括第一符号之前的报头或其他数据。例如,Snappy压缩文件格式包括将文件的未压缩长度存储为小字节序varint的前导。计算设备100可以执行任何适当的操作以便处理报头并且将输入流指针增大至第一符号。

在框304中,计算设备100打开输出流214并初始化输出流指针。计算设备100可以使用任何技术来打开输出流214,比如,创建存储器内写入缓冲器或对文件进行存储器映射。在打开之后,计算设备100能够从输出流指针开始将数据写入输出流214。计算设备100还能够从用于解压缩参考符号的输出流214中读取和/或复制数据。

在框306中,计算设备100从输入流指针中读取当前输入符号的标签值。在对以Snappy格式存储的文件进行解压缩的说明性实施例中,计算设备100从输入流212中读取单个标签字节。然而,在其他实施例中,计算设备100可以读取附加标签数据。如以上所描述的,输入流212包括符号序列,包括文字量符号和参考符号。标签值可由计算设备100用于确定当前符号的类型,并且还可以用于确定符号的如偏移量和数据长度等参数。

现在参照图4,图400展示了以Snappy格式使用各种符号。每一个符号开始于标签字节并且在标签字节的2个最低有效位中包括可以用于对符号进行分类的2位类别值。符号402、404是文字量符号,类别值等于二进制值“00”。符号402包括标签字节,在标签字节之后是文字量数据字节序列。标签字节的6个最高有效位表示文字量的长度减去1。符号402可以表示长度为从1字节到60字节(包括)的文字量。由此,符号402可以用于相对短的文字量。

符号404可以用于更长的文字量。符号404包括标签字节,在标签字节之后是长度值并且之后是文字量数据字节序列。对标签字节的6个最高有效位进行编码以便指示使用多少字节来存储长度值。对应于60、61、62或63的二进制值分别与1至4字节的长度相对应。长度值等于文字量的长度减1,以小字节序格式存储。

符号406、408、410是参考符号。符号406是一字节偏移量参考符号,类别值等于二进制值“01”。符号406包括11位偏移量值。偏移量的三个最高有效位(O10O8)存储在标签字节的三个最高有效位中,并且偏移量的剩余部分(位O7O0)存储在标签字节之后的下一字节中。标签字节还包括定位在偏移量位和类别位之间的3位长度值(标签字节中标号为4至2的位,标记为l2至l0)。长度值表示数据长度减4;因此,符号406可以存储从4到11(包括)的长度以及从0到2047(包括)的偏移量。

符号408是两字节偏移量参考符号,类别值等于二进制值“10”。符号408包括标签字节之后的两字节偏移量值,存储为小字节序16位整数。换言之,偏移量的第一字节存储8个最低有效位,并且偏移量的第二字节存储8个最高有效位。长度值存储在标签字节的6个最高有效位中,并且表示要复制的数据的长度减1。符号408可以存储从1到64(包括)的长度以及从0到65,535(包括)的偏移量。

符号408是四字节偏移量参考符号,类别值等于二进制值“11”。符号408包括标签字节之后的四字节偏移量值,存储为小字节序32位整数。长度值存储在标签字节的6个最高有效位中,并且等于要复制的数据的长度减1。因为生成四字节偏移量参考符号将需要压缩器维持大量历史,所以这种符号在使用时的压缩数据中可能非常罕见。

返回参照图3A,在读取标签值之后,在框308中,计算设备100判定标签值是否大于最大数据长度。如果标签值大于最大数据长度,则计算设备100可能不能对符号进行快速通路解压缩。在许多实施例中,因为如以上所描述的,如果标签值的高6位大于或等于60(因为高6位包括长度减1),则符号可以是如图4的符号404等大文字量符号,所以最大数据长度可以是60字节。在那些实施例中,计算设备100可以判定标签字节的高6位是否大于或等于60,这可能相当于判定标签值是否大于或等于60乘以4。如果计算设备100确定标签值大于最大数据长度,则方法300分支到框310。如以下所描述的,若否,则计算设备100前进到框312。

在框310中,计算设备100使用缓慢通路例程来解压缩当前输入符号。缓慢通路例程可以执行普通、经优化的或未经优化的解压缩算法。具体地,当执行缓慢通路例程时,计算设备100可以执行不可预测的分支指令或其他可能很慢的指令,以便对输入符号执行正确解压缩。因为很少采用缓慢通路,所以方法300的整体性能可能不会受到分支误预测惩罚或缓慢通路中的其他性能问题的负面影响。当执行缓慢通路例程时,计算设备100可能不会做出关于当前输入符号的类型的假设并且由此可能对所有可能的格式进行检查。例如,尽管标签字节可以让其高6位大于或等于60,但是当前输入符号不一定是长的文字量符号。例如,当前符号可以是长度大于60的两字节或四字节参考符号。在解压缩当前符号并相应更新输入流指针和输出流指针之后,方法300循环回到框306以便继续解压缩下一符号。

返回参照框308,如果标签值不大于或等于60乘以4,则方法300前进到框312。因为标签值将仅很少大于或等于60乘以4,所以在大多数迭代中,方法300前进到框312。因此,处理器120的分支预测硬件可能能够高准确性地预测方法300是否前进到框312。在框312中,计算设备100将类别值设置成等于标签字节的低2位。计算设备100可以例如使用一项或多项逐位运算来遮蔽所述低2位。如在图4中所示出的,两位类别值标识了4种不同类型的符号:文字量、一字节偏移量参考、两字节偏移量参考、和四字节偏移量参考。

在框314中,计算设备100判定当前符号的类别是否为四字节偏移量参考符号。例如,计算设备100可以判定类别值是否等于二进制值“11”。计算设备100可能不能对四字节偏移量参考符号进行快速通路解压缩。如以上所描述的,如果符号是四字节偏移量参考符号,则方法300分支到框310以便执行缓慢通路解压缩例程。如果符号不是四字节偏移量参考符号,则方法300前进到框316。如以上所描述的,四字节偏移量参考符号很罕见。因此,在大多数迭代中,方法300前进到框316,并且处理器120的分支预测硬件可能能够高准确性地预测方法300是否前进到框316。

在框316中,计算设备100通过使用标签字节来对下一符号增量表216进行索引从而查找下一符号的增量值。下一符号增量表216很小(例如,仅仅256字节)并且可能能够存储在处理器120的缓存存储器中。因此,可以非常迅速地完成对下一符号增量值的确定(例如,在L1缓存命中所需的时间内,例如,4个时钟周期)。如以下所描述的,可以将下一符号增量值添加到输入流指针中以便确定下一符号在输入流212中的位置。由此,可能在方法300的关键路径上确定下一符号增量值。通过迅速地计算下一符号增量值并且在不依赖于任何不可预测的分支的情况下,计算设备100可以减小关键路径的长度和/或等待时间。具体地,在具有能够进行无序指令执行的处理器120的实施例中,计算设备100可能能够继续无序执行以便对附加输入符号进行解压缩。进一步地,尽管被展示为从下一符号增量表216中查找下一符号增量值,但是应当理解的是,在一些实施例中,计算设备100可以以编程方式计算下一符号增量值。

在框318中,计算设备100通过使用标签字节来对文字量增量表218进行索引从而查找文字量符号起点的增量值。如通过图4的符号402、404来展示的,对于文字量符号,根据文字量数据的长度,从标签字节的地址到文字量数据的起点的增量可能在1至5字节之间变化。另外,因为文字量增量值将不会用于参考符号,所以文字量增量表218可以包括与那些符号相关联的标签字节的任何值。类似于下一符号增量表216,文字量增量表218很小(例如,仅仅256字节)并且可能能够存储在处理器120的缓存存储器中。进一步地,尽管被展示为从文字量增量表218中查找文字量增量值,但是应当理解的是,在一些实施例中,计算设备100可以以编程方式计算文字量增量值。另外地或可替代地,在一些实施例中,快速通路解压缩例程可以仅解压缩具有1字节偏移量的相对短的文字量。在那些实施例中,文字量增量表218可以包括所有“1”,或者文字量数据的起点的增量可以是恒定值1,并且可以省略文字量增量表218。

在框320中,计算设备100通过使用标签字节来对长度表220进行索引从而查找要复制的数据的长度。可通过快速通路解压缩过程来处理的所有符号包括对数据长度在标签字节本身中的表示。例如,图4的符号402、406、408全部包括在标签字节中的长度。长度表220可以包括将不会通过快速通路例程来处理的标签字节的任何值——或不包括所述标签字节的任何值。类似于表216、218,长度表220很小(例如,仅仅256字节)并且可能能够存储在处理器120的缓存存储器中。进一步地,尽管被展示为从长度表220中查找数据长度,但是应当理解的是,在一些实施例中,计算设备100可以以编程方式计算数据长度值。

在框322中,计算设备100将标签值右移五位,保留原始高三位。将标签值右移允许计算设备100提取一字节参考符号的偏移量的高位。如通过图4的符号406来展示的,将标签字节右移五位就将偏移量的高三位(O10O8)移动至标签字节的是三个最低有效位。

在框324中,计算设备100将文字量指针设置为指向输入流指针加上如通过以上在框318中所描述的方式来确定的文字量增量值。计算设备100可以在不判定当前符号是文字量符号还是参考符号的情况下设置文字量指针。如以下所描述的,计算设备100将忽视参考符号的文字量指针。

现在参照图3B,方法300继续框326,在所述框中,计算设备100有条件地移动偏移量值的第二字节:如果符号是两字节偏移量参考符号则移动至标签值,如果符号不是两字节偏移量参考符号则保留标签值。如通过图4的符号408来展示的,对于两字节偏移量符号,偏移量值的第二字节包括偏移量值的8个最高有效位(位15至8)。计算设备100可以在不执行条件分支指令的情况下使用任何技术来有条件地设置标签值。例如,计算设备100可以使用三元运算符、预测的指令、条件移动指令、或其他处理器指令来执行条件移动。在说明性实施例中,计算设备100测试类别值是否与二进制值“10”相匹配并且然后基于测试结果来执行条件移动(CMOV)指令。执行条件移动指令允许计算设备100在不执行任何不可预测的分支指令和引起相关联的分支误预测惩罚的情况下选择适当的值。

在框328中,计算设备100将偏移量值设置成标签值与偏移量的第一字节的联接。如以上所描述的,标签值包括如以上关于框322而描述的偏移量值的3个最高有效位或如以上关于框326而描述的偏移量值的8个最高有效位。由此,在联接之后,偏移量值对于一字节偏移量符号和两字节偏移量符号两者而言是恰当的。另外,如以上所描述的,已经在没有执行任何不可预测的分支指令的情况下计算了偏移量值。

在框330中,计算设备100有条件地设置源指针:如果所述符号具有文字量类别则设置为文字量指针,并且如果所述符号不具有文字量类别值则设置为输出流指针与偏移量值之差。计算设备100可以使用任何技术来有条件地设置源指针。例如,计算设备100可以使用三元运算符、预测的指令、条件移动指令、或其他处理器指令来执行条件移动。在说明性实施例中,计算设备100测试类别值是否为二进制值“00”并且然后基于测试结果来执行条件移动(CMOV)指令以便移动文字量指针或输出流指针与偏移量值之差。执行条件移动指令允许计算设备100在不执行任何不可预测的分支指令和引起相关联的分支误预测惩罚的情况下设置源指针的适当值。如以下进一步描述的,在确定源指针之后,计算设备100可以将数据长度量的字节从源指针复制到输出流指针。由此,从输入流212的文字量数据或者从之前输出到输出流214的数据中复制实际数据。

在框332中,计算设备100判定偏移量值是否小于16以及符号的类别是否不是文字量。在一些实施例中,计算设备100可以执行该测试的短路逻辑评估。也就是说,如果偏移量值大于或等于16,则计算设备100可以不测试符号的类别。在许多实施例中,偏移量值通常大于或等于16。由此,可以使用计算设备100的分支预测硬件来高度预测框332的确定。如以下所描述的,如果偏移量值小于16并且类别不是文字量,则方法332分支到框336。若否,则方法300分支到框334。

在框334中,计算设备100对起始于源指针的数据长度数量个字节执行到输出流指针的16字节块存储器复制。在许多实施例中,计算设备100的处理器120能够例如使用专用向量指令或向量寄存器来执行快速16字节非对齐存储器副本。因为计算设备100一次复制16字节的数据,所以可以将比所请求的数据长度更多的数据复制到输出流214中。然而,如以下所描述的,在完成复制之后,该不正确地复制的数据将被定位成经过输出流指针,并且由此,在对附加符号进行解码时,将使用正确数据来复写所述不正确地复制的数据。如以下所描述的,在复制数据之后,方法300前进到框338。

返回参照框332,如果偏移量值小于16并且类别不是文字量,则方法332分支到框336。在框336中,计算设备100对数据长度个字节执行从源指针到输出流指针的逐字节存储器复制。尽管执行逐字节复制通常可能比块复制更慢,但是可能为了正确性和/或为了避免页面错误或其他错误而需要逐字节复制。在复制数据之后,方法300前进到框338。

在框338中,计算设备100将输出流指针增大复制到输出流214的数据的长度。由此,输出流指针准备在输出流214中的正确位置处写入下一符号的解压缩数据。在框340中,计算设备100将输入流指针增大下一符号增量值。由此,输入流指针准备在输入流212中的正确位置处读取下一输入符号的数据。

在框342中,计算设备100判定是否仍需对附加符号进行解码。计算设备100可以使用任何技术来判定是否还有附加符号,比如,将输出流指针或输入流指针与之前基于压缩文件的报头来确定的最大大小进行比较、测试在输入流212中是否已经到达文件的终点、或者任何其他测试。如果还有附加符号,则方法300循环回图3A中所示出的框306,以便读取下一标签字节。如果没有附加符号,则方法300完成。计算设备100可以关闭输入流212和/或输出流214、输出解压缩内容、或者执行任何其他需要的处理以便产生解压缩输出。方法300可以重新开始于框302以便执行附加解压缩。

现在参照图5,伪代码500展示了方法300的一个潜在实施例。如所示出的,伪代码500展示了操作306’至340’,每一项操作分别与图3A和图3B的框306至340的一个说明性实施例相对应。具体地,伪代码500判定是否通过执行可高度预测的“如果语句:如果正确,则可以跳到缓慢通路例程”来在与框308至314的一个说明性实施例相对应的操作308’至314’中应用缓慢通路例程。另外,伪代码500在操作330’中有条件地分配源指针的值,所述操作包括三元运算符并与框330的一个说明性实施例相对应。如以上所描述的,在许多实施例中,可以将该三元运算符编译成包括如CMOV等条件移动指令的可执行代码。伪代码500还使用与框326的一个说明性实施例相对应的包括三元运算符的类似操作326’来有条件地移动偏移量值的第二字节。现在参照图6,伪代码600展示了操作326”、328”,每一项操作分别与方法300的框326、328的另一个说明性实施例相对应。如所示出的,伪代码600还使用三元运算符来计算偏移量值,所述偏移量值可以被编译成包括如CMOV等条件移动指令的可执行代码。

示例

以下提供了在本文中所公开的技术的说明性示例。所述技术的实施例可以包括以下所描述的示例中的任何一个或多个示例及其任何组合。

示例1包括一种用于数据解压缩的计算设备,所述计算设备包括:输入模块,所述输入模块用于从输入指针所标识的存储器位置中读取符号标签值;符号标签解码模块,所述符号标签解码模块用于根据所述符号标签值来确定下一符号增量值、文字量增量值、数据长度和偏移量值;数据源模块,所述数据源模块用于有条件地设置源指针:(i)响应于确定所述符号标签值包括文字量类别值而设置成所述输入指针加上所述文字量增量值,并且(ii)响应于确定所述符号标签值不包括所述文字量类别值而设置成输出指针减去所述偏移量值;以及输出模块,所述输出模块用于将具有所述数据长度的数据从所述源指针所标识的存储器位置复制到所述输出指针所标识的存储器位置;其中,所述输入模块进一步用于响应于对所述数据的复制而将所述输入指针增大所述下一符号增量值。

示例2包括如示例1所述的主题,并且其中,有条件地设置所述源指针包括在不执行分支指令的情况下有条件地设置所述源指针。

示例3包括如示例1和2中任一项所述的主题,并且其中,有条件地设置所述源指针包括使用条件移动指令来有条件地设置所述源指针。

示例4包括如示例1至3中任一项所述的主题,并且进一步包括:缓慢通路模块,所述缓慢通路模块用于响应于确定无法对当前符号进行快速通路解码而执行缓慢通路解压缩例程;其中,所述符号标签解码模块进一步用于根据所述符号标签值并且在确定所述下一符号增量值之前判定是否可以对所述当前符号进行快速通路解码。

示例5包括如示例1至4中任一项所述的主题,并且其中,判定是否可以对所述当前符号进行快速通路解码包括根据所述符号标签来判定所述数据长度是否与最大数据长度具有预定义关系。

示例6包括如示例1至5中任一项所述的主题,并且其中,判定所述数据长度是否与所述最大数据长度具有所述预定义关系包括判定所述数据长度是否大于六十字节。

示例7包括如示例1至6中任一项所述的主题,并且其中,判定是否可以对所述当前符号进行快速通路解码包括判定所述符号标签是否包括四字节偏移量类别值。

示例8包括如示例1至7中任一项所述的主题,并且其中,确定所述下一符号增量值包括使用所述符号标签值来对下一符号增量表进行索引。

示例9包括如示例1至8中任一项所述的主题,并且其中,对所述下一符号增量表进行索引包括在存储在所述计算设备的处理器的缓存存储器中的所述下一符号增量表中查找所述下一符号增量值。

示例10包括如示例1至9中任一项所述的主题,并且其中,用于确定所述文字量增量值包括用于使用所述符号标签值来对文字量增量表进行索引。

示例11包括如示例1至10中任一项所述的主题,并且其中,对所述文字量增量表进行索引包括在存储在所述计算设备的处理器的缓存存储器中的所述文字量增量表中查找所述文字量增量值。

示例12包括如示例1至11中任一项所述的主题,并且其中,确定所述数据长度包括使用所述符号标签值来对长度表进行索引。

示例13包括如示例1至12中任一项所述的主题,并且其中,对所述长度表进行索引包括在存储在所述计算设备的处理器的缓存存储器中的所述长度表中查找所述数据长度。

示例14包括如示例1至13中任一项所述的主题,并且其中,读取所述符号标签值包括从所述输入指针所标识的所述存储器位置中读取标签字节。

示例15包括如示例1至14中任一项所述的主题,并且其中,根据所述符号标签值来确定所述偏移量值包括:将所述标签字节右移五位;有条件地设置所述标签字节:如果所述符号标签值包括两字节偏移量类别值则设置成从所述输入指针所标识的所述存储器位置中读取的第二偏移量字节,并且如果所述符号标签值不包括所述两字节偏移量类别值则设置成所述标签字节;以及联接所述标签字节与从所述输入指针所标识的所述存储器位置中读取的第一偏移量字节,以便生成所述偏移量值。

示例16包括如示例1至15中任一项所述的主题,并且其中,有条件地设置所述标签字节包括使用条件移动指令来有条件地设置所述标签字节。

示例17包括如示例1至16中任一项所述的主题,并且其中,将具有所述数据长度的数据从所述源指针所标识的所述存储器位置复制到所述输出指针所标识的所述存储器位置包括:判定所述偏移量值是否小于预定义块大小;响应于确定所述偏移量值小于所述预定义块大小而判定所述符号标签值是否不包括文字量类别值;响应于确定所述符号标签值不包括所述文字量类别值而进行从所述源指针所标识的所述存储器位置到所述输出指针所标识的所述存储器位置的具有所述数据长度的逐字节存储器复制;以及响应于确定所述偏移量值不小于所述预定义块大小或者响应于确定所述符号标签值包括所述文字量类别值而使用具有所述预定义块大小的块来进行从所述源指针所标识的所述存储器位置到所述输出指针所标识的所述存储器位置的具有所述数据长度的块存储器复制。

示例18包括如示例1至17中任一项所述的主题,并且其中,所述预定义块大小包括十六字节、三十二字节、或六十四字节。

示例19包括如示例1至18中任一项所述的主题,并且其中,所述输出模块进一步用于响应于对所述数据的复制而将所述输出指针增大所述数据长度。

示例20包括示例1至19中任一项所述的主题,并且其中,所述输入模块进一步用于:响应于对所述输入指针的增大而判定是否还有附加符号;以及响应于确定还有附加符号而从所述输入指针所标识的存储器位置中读取下一符号标签值。

示例21包括一种用于数据解压缩的方法,所述方法包括:由计算设备从输入指针所标识的存储器位置中读取符号标签值;由所述计算设备根据所述符号标签值来确定下一符号增量值、文字量增量值、数据长度和偏移量值;由所述计算设备有条件地设置源指针:(i)响应于确定所述符号标签值包括文字量类别值而设置成所述输入指针加上所述文字量增量值,并且(ii)响应于确定所述符号标签值不包括所述文字量类别值而设置成输出指针减去所述偏移量值;由所述计算设备将具有所述数据长度的数据从所述源指针所标识的存储器位置复制到所述输出指针所标识的存储器位置;以及由所述计算设备响应于复制所述数据而将所述输入指针增大所述下一符号增量值。

示例22包括如示例21所述的主题,并且其中,有条件地设置所述源指针包括在不执行分支指令的情况下有条件地设置所述源指针。

示例23包括如示例21和22中任一项所述的主题,并且其中,有条件地设置所述源指针包括使用条件移动指令来有条件地设置所述源指针。

示例24包括如示例21至23中任一项所述的主题,并且进一步包括:由所述计算设备根据所述符号标签值并且在确定所述下一符号增量值之前判定是否可以对当前符号进行快速通路解码;以及由所述计算设备响应于确定无法对所述当前符号进行快速通路解码而执行缓慢通路解压缩例程。

示例25包括如示例21至24中任一项所述的主题,并且其中,判定是否可以对所述当前符号进行快速通路解码包括根据所述符号标签来判定所述数据长度是否与最大数据长度具有预定义关系。

示例26包括如示例21至25中任一项所述的主题,并且其中,判定所述数据长度是否与所述最大数据长度具有所述预定义关系包括判定所述数据长度是否大于六十字节。

示例27包括如示例21至26中任一项所述的主题,并且其中,判定是否可以对所述当前符号进行快速通路解码包括判定所述符号标签是否包括四字节偏移量类别值。

示例28包括如示例21至27中任一项所述的主题,并且其中,确定所述下一符号增量值包括使用所述符号标签值来对下一符号增量表进行索引。

示例29包括如示例21至28中任一项所述的主题,并且其中,对所述下一符号增量表进行索引包括在存储在所述计算设备的处理器的缓存存储器中的所述下一符号增量表中查找所述下一符号增量值。

示例30包括如示例21至29中任一项所述的主题,并且其中,确定所述文字量增量值包括使用所述符号标签值来对文字量增量表进行索引。

示例31包括如示例21至30中任一项所述的主题,并且其中,对所述文字量增量表进行索引包括在存储在所述计算设备的处理器的缓存存储器中的所述文字量增量表中查找所述文字量增量值。

示例32包括如示例21至31中任一项所述的主题,并且其中,确定所述数据长度包括使用所述符号标签值来对长度表进行索引。

示例33包括如示例21至32中任一项所述的主题,并且其中,对所述长度表进行索引包括在存储在所述计算设备的处理器的缓存存储器中的所述长度表中查找所述数据长度。

示例34包括如示例21至33中任一项所述的主题,并且其中,读取所述符号标签值包括从所述输入指针所标识的所述存储器位置中读取标签字节。

示例35包括如示例21至34中任一项所述的主题,并且其中,根据所述符号标签值来确定所述偏移量值包括:将所述标签字节右移五位;有条件地设置所述标签字节:如果所述符号标签值包括两字节偏移量类别值则设置成从所述输入指针所标识的所述存储器位置中读取的第二偏移量字节,并且如果所述符号标签值不包括所述两字节偏移量类别值则设置成所述标签字节;以及联接所述标签字节与从所述输入指针所标识的所述存储器位置中读取的第一偏移量字节,以便生成所述偏移量值。

示例36包括如示例21至35中任一项所述的主题,并且其中,有条件地设置所述标签字节包括使用条件移动指令来有条件地设置所述标签字节。

示例37包括如示例21至36中任一项所述的主题,并且其中,将具有所述数据长度的数据从所述源指针所标识的所述存储器位置复制到所述输出指针所标识的所述存储器位置包括:判定所述偏移量值是否小于预定义块大小;响应于确定所述偏移量值小于所述预定义块大小而判定所述符号标签值是否不包括文字量类别值;响应于确定所述符号标签值不包括所述文字量类别值而进行从所述源指针所标识的所述存储器位置到所述输出指针所标识的所述存储器位置的具有所述数据长度的逐字节存储器复制;以及响应于确定所述偏移量值不小于所述预定义块大小或者响应于确定所述符号标签值包括所述文字量类别值而使用具有所述预定义块大小的块来进行从所述源指针所标识的所述存储器位置到所述输出指针所标识的所述存储器位置的具有所述数据长度的块存储器复制。

示例38包括如示例21至37中任一项所述的主题,并且其中,所述预定义块大小包括十六字节、三十二字节、或六十四字节。

示例39包括如示例21至38中任一项所述的主题,并且进一步包括由所述计算设备响应于复制所述数据而将所述输出指针增大所述数据长度。

示例40包括示例21至39中任一项所述的主题,并且进一步包括:由所述计算设备响应于增大所述输入指针而判定是否还有附加符号;以及由所述计算设备响应于确定还有附加符号而从所述输入指针所标识的存储器位置中读取下一符号标签值。

示例41包括一种计算设备,所述计算设备包括:处理器;以及存储器,所述存储器具有存储于其中的多条指令,所述指令当由所述处理器执行时使所述计算设备执行如示例21至40中任一项所述的方法。

示例42包括一种或多种机器可读存储介质,所述一种或多种机器可读存储介质包括存储于其上的多条指令,所述指令响应于被执行而使计算设备执行如示例21至40中任一项所述的方法。

示例43包括一种计算设备,所述计算设备包括用于执行如示例21至40中任一项所述的方法的装置。

示例44包括一种用于数据解压缩的计算设备,所述计算设备包括:用于从输入指针所标识的存储器位置中读取符号标签值的装置;用于根据所述符号标签值来确定下一符号增量值、文字量增量值、数据长度和偏移量值的装置;用于有条件地设置源指针的装置:(i)响应于确定所述符号标签值包括文字量类别值而设置成所述输入指针加上所述文字量增量值,并且(ii)响应于确定所述符号标签值不包括所述文字量类别值而设置成输出指针减去所述偏移量值;用于将具有所述数据长度的数据从所述源指针所标识的存储器位置复制到所述输出指针所标识的存储器位置的装置;以及用于响应于复制所述数据而将所述输入指针增大所述下一符号增量值的装置。

示例45包括如示例44所述的主题,并且其中,用于有条件地设置所述源指针的所述装置包括用于在不执行分支指令的情况下有条件地设置所述源指针的装置。

示例46包括如示例44和45中任一项所述的主题,并且其中,用于有条件地设置所述源指针的所述装置包括用于使用条件移动指令来有条件地设置所述源指针的装置。

示例47包括如示例44至46中任一项所述的主题,并且进一步包括:用于根据所述符号标签值并且在确定所述下一符号增量值之前判定是否可以对当前符号进行快速通路解码的装置;以及用于响应于确定无法对所述当前符号进行快速通路解码而执行缓慢通路解压缩例程的装置。

示例48包括如示例44至47中任一项所述的主题,并且其中,用于判定是否可以对所述当前符号进行快速通路解码的所述装置包括用于根据所述符号标签来判定所述数据长度是否与最大数据长度具有预定义关系的装置。

示例49包括如示例44至48中任一项所述的主题,并且其中,用于判定所述数据长度是否与所述最大数据长度具有所述预定义关系的所述装置包括用于判定所述数据长度是否大于六十字节的装置。

示例50包括如示例44至49中任一项所述的主题,并且其中,用于判定是否可以对所述当前符号进行快速通路解码的所述装置包括用于判定所述符号标签是否包括四字节偏移量类别值的装置。

示例51包括如示例44至50中任一项所述的主题,并且其中,用于确定所述下一符号增量值的所述装置包括用于使用所述符号标签值来对下一符号增量表进行索引的装置。

示例52包括如示例44至51中任一项所述的主题,并且其中,用于对所述下一符号增量表进行索引的所述装置包括用于在存储在所述计算设备的处理器的缓存存储器中的所述下一符号增量表中查找所述下一符号增量值的装置。

示例53包括如示例44至52中任一项所述的主题,并且其中,用于确定所述文字量增量值的所述装置包括用于使用所述符号标签值来对文字量增量表进行索引的装置。

示例54包括如示例44至53中任一项所述的主题,并且其中,用于对所述文字量增量表进行索引的所述装置包括用于在存储在所述计算设备的处理器的缓存存储器中的所述文字量增量表中查找所述文字量增量值的装置。

示例55包括如示例44至54中任一项所述的主题,并且其中,用于确定所述数据长度的所述装置包括用于使用所述符号标签值来对长度表进行索引的装置。

示例56包括如示例44至55中任一项所述的主题,并且其中,用于对所述长度表进行索引的所述装置包括用于在存储在所述计算设备的处理器的缓存存储器中的所述长度表中查找所述数据长度的装置。

示例57包括如示例44至56中任一项所述的主题,并且其中,用于读取所述符号标签值的所述装置包括用于从所述输入指针所标识的所述存储器位置中读取标签字节的装置。

示例58包括如示例44至57中任一项所述的主题,并且其中,用于根据所述符号标签值来确定所述偏移量值的所述装置包括:用于将所述标签字节右移五位的装置;用于有条件地设置所述标签字节的装置:如果所述符号标签值包括两字节偏移量类别值则设置成从所述输入指针所标识的所述存储器位置中读取的第二偏移量字节,并且如果所述符号标签值不包括所述两字节偏移量类别值则设置成所述标签字节;以及用于联接所述标签字节与从所述输入指针所标识的所述存储器位置中读取的第一偏移量字节以便生成所述偏移量值的装置。

示例59包括如示例44和58中任一项所述的主题,并且其中,用于有条件地设置所述标签字节的所述装置包括用于使用条件移动指令来有条件地设置所述标签字节的装置。

示例60包括如示例44至59中任一项所述的主题,并且其中,用于将具有所述数据长度的数据从所述源指针所标识的所述存储器位置复制到所述输出指针所标识的所述存储器位置的所述装置包括:用于判定所述偏移量值是否小于预定义块大小的装置;用于响应于确定所述偏移量值小于所述预定义块大小而判定所述符号标签值是否不包括文字量类别值的装置;用于响应于确定所述符号标签值不包括所述文字量类别值而进行从所述源指针所标识的所述存储器位置到所述输出指针所标识的所述存储器位置的具有所述数据长度的逐字节存储器复制的装置;以及用于响应于确定所述偏移量值不小于所述预定义块大小或者响应于确定所述符号标签值包括所述文字量类别值而使用具有所述预定义块大小的块来进行从所述源指针所标识的所述存储器位置到所述输出指针所标识的所述存储器位置的具有所述数据长度的块存储器复制的装置。

示例61包括如示例44至60中任一项所述的主题,并且其中,所述预定义块大小包括十六字节、三十二字节、或六十四字节。

示例62包括如示例44至61中任一项所述的主题,并且进一步包括用于响应于复制所述数据而将所述输出指针增大所述数据长度的装置。

示例63包括示例44至62中任一项所述的主题,并且进一步包括:用于响应于增大所述输入指针而判定是否还有附加符号的装置;以及用于响应于确定还有附加符号而从所述输入指针所标识的存储器位置中读取下一符号标签值的装置。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1