新闻中心

EEPW首页>嵌入式系统>设计应用> 基于龙芯2F的Glibc库优化

基于龙芯2F的Glibc库优化

作者: 时间:2010-12-14 来源:网络 收藏

3.2 数据转换函数
数据转换函数包括字符串转换为整数和浮点数。文章分别在每类函数中取一个例子说明优化过程。
字符串转换为整数包括strtol、strtoul、strtoll等函数,它们分别解析不同的整数类型,支持从2到36的转换进制。各函数实现上不同的地方仅在于不同类型的整数大小范围不同,处理流程类似。下面以strtol函数为例介绍优化过程,它的功能为将字符串转换为long型整数。
Glibc库中strtol的实现使用普通的逐字节读取并计算的方式。我们首先对转换进制分情况处理,对于2的幂次方的进制,如2、4、8、16、32,字符串中的每个数字在二进制位上没有关联。可以将它们逐个转换成二进制位后填入返回值的相应位置,具有较快的转换速度。其次十进制转换是一种常用的情况,也将其单独列出,可以省去对字母进行判断。
给定进制后,在该进制下整数至多有多少位就可以确定。当字符串中的合法数字个数超过位数限制时,直接返回该类型下的最大值即可。当字符串中的合法数字小于位数限制时,可知解析后的结果绝对不会超过该整数类型的表示范围,此时我们将字符串进行分段并对解析进程进行循环展开。如果合法数字个数恰好等于位数限制,此时解析结果有超过该类型下最大值的可能性,首先将小于位数限制的部分解析完成后,再考虑最后一位数字。提前确定解析结果的范围可以避免每次循环内都要对是否超出该类型的最大值进行判断。
取进制从2到36,字符串的长度从1到该进制下的最大值进行测试,得到各进制下的优化效果如图1所示,各进制的平均优化比率为30.9%。
b.JPG

strtod、strtof、strtold等函数将字符串转换为浮点数。我们以strtod函数为例进行介绍,它将字符串转换为double型浮点数。
Glibc库中strtod的实现使用高精度计算。首先遍历整个字符串,找出其中的整数、小数和指数部分,各个部分分别使用高精度计算解析,再将结果合并。对于一般的实现来说,各个部分的取值不会太大,此时使用高精度计算时间消耗较大,改进的实现将每个部分再进行分
块,对每个分块使用整数进行解析,实现方式与strtol相同。各个部分的分块解析完成后,使用一个long double类型作为临时变量合并解析结果以避免精度丢失,最后将该变量转换为doulble类型返回。对于strtof函数,使用double类型作为临时变量。而对于strtold函数,使用上述方法无法保证精度,仍采用原始的实现。
由于双精度浮点数的有效位数为16至17位,对字符串长度从1到17进行测试,得到各长度下的优化效果如图2所示,各长度的平均优化比率为49.8%。
c.JPG

3.3 哈希表查找函数
Glibc库中哈希表所包含的关键字和数据分别为字符串和内存块,其相关的函数包括hcreate,hdestory以及hsearch,分别完成哈希表的创建,销毁和查找。创建与销毁操作都是一次性的,我们对查找操作进行优化。
hsearch函数读入字符串关键字作为参数,首先将其映射为整数关键值,接着使用双重散列逐个取出元素进行判断。
Glibc库中字符串映射为整数的实现方法为,首先求得字符串的长度作为初值,接着将其不断左移4位并从末尾到头部逐个与字符串中的字符相加。该方法需要对字符串进行两次遍历,并且当字符串较长时,字符串的长度和进行累加的前几个字符会被移出而不影响最终的映射值。例如对32位的整型数来说,只有字符串的前8个字符对映射值有影响。
我们使用ELF哈希算法来替换原有的映射实现,此算法不先对字符串求长,仅进行移位和累加操作的循环,为了避免原始实现的缺点,每次循环中都会判断移位是否超出范围,如果超出,则把中间结果的高八位异或到低八位上。该哈希函数只需对字符串遍历一遍,并且考虑了移位越界,避免了只有前几个字符影响映射值的缺陷。
3.4 加密函数
Glibc库中的加密函数为crypt函数,该函数单向加密给定的字符串,支持的算法包括MD5、SHA以及DES算法。由于MD5与DES算法的实现流程固定且做了较充分的展开,因此我们主要考虑SHA算法。针对该算法有设计硬件结构进行的优化,而我们的工作从代码实现角度进行。下面以SHA-256为例说明优化过程,其它SHA算法与之类似。


关键词:C语言

评论


相关推荐

技术专区

关闭