用于在c中加倍节省时间转换的字符串

时间:2012-11-05 10:45:57

标签: c type-conversion

我正在进行操作的基准测试任务(在Linux下的C语言中),在这个操作中我们使用从字符串到双倍的转换(使用atof或sscanf函数)但这里的问题是他们给出了相对较长的时间(分别为145,270 ns),不适合操作。那么,你知道其他任何可以节省时间的转换机制吗?

我尝试使用强制转换,但它给出了零

double d;

char ch[] = "123.154";

d = *((double *) ch);

printf ("%lf\n", d);         // result 0 (compiled using gcc)

此致

2 个答案:

答案 0 :(得分:2)

atof()sscanf()是接受各种格式的通用方法。如果您知道浮点值遵循某种模式,则可以尝试优化预期格式的转换。即。无需支持(+ - ),无需支持Inf,Nan或sci-notation(1.3e43)等。

可以创建一个从字符串一次转换3个字符的查找表:   表[a * 256 + b * 16 + c] = a * 100 + b * 10 + c;其中一个简单地连接例如4个LSB位。字符串“432”;索引的十六进制值将是0x432,内容将是432。

强制转换意味着更改某些二进制数据的解释。双精度或浮点数和整数不是二进制兼容的(除了(+)0的值)。但是,如果字符串中的三个第一个字符是数字,则以下转换用于检查:

 char num[]="123.123";
 if ((*((int*)num) & 0x00f0f0f0) == 0x00303030) // can use faster conversion

 // this means interpreting the pointer to string as a pointer to integer
 // and then referencing the contents of the memory _as_ integer (+ some bitmasking)

此外,如果浮点集相对较小,或者某个特定值非常频繁,则可以换取空间以获得速度并选择散列表。如果散列表具有匹配,则可以并行比较字符串4或8字节以验证(或者如果已知输入有效则跳过该部分)。也可以通过散列前4个字符进行初始猜测,然后从接下来的4个字符继续进行组合来结合这些技术。

答案 1 :(得分:0)

double d;
char ch[] = "123.154";
d = atof(ch);
printf ("%f\n", d); 

或者:

printf ("%s\n", ch);