免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7608 | 回复: 11
打印 上一主题 下一主题

[C] 请问为什么sscanf比fscanf慢很多 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-10 15:09 |只看该作者 |倒序浏览
我的程序里面用sscanf非常慢,不知道为什么。

比如在buf数组里面读出格式化数据,用sscanf居然还不如先将buf写到文件里,然后fseek到文件头,再用fscanf读,这样比用sscanf快几十倍。实在是想不通为啥。

论坛徽章:
0
2 [报告]
发表于 2009-03-10 15:11 |只看该作者
???
上测试数据和代码

论坛徽章:
0
3 [报告]
发表于 2009-03-10 15:12 |只看该作者
不是吧。。。

论坛徽章:
0
4 [报告]
发表于 2009-03-10 15:21 |只看该作者
情况是这样的。

我有一个链表,链表中的每个节点大小不一样。现在需要将这个链表传到另外一个机器上。

在本地我将链表按顺序格式化输入到buf中,然后传到远端机器,远端机器再从buf中格式化读出数据重新组成链表。

buf大小约为2.5M,链表节点里面只有char和int两种类型。

远端机器如果用sscanf读buf数据,耗时一分多钟,如果用fscanf读,小于2秒钟。

系统是 GUN/Debian, 内核2.6.18

论坛徽章:
0
5 [报告]
发表于 2009-03-10 15:35 |只看该作者
char *tmp = buf;
while( *tmp != '\0' )
{
        sscanf(tmp, "%s %d %d %d", name, &pd, &filelen, &hitnum);

        tmp += (size_t) ( 50 )
        while (hitnum--){
                int position;
                sscanf(tmp, "%d", &position);
                tmp += (size_t)(10);
        }
}

这是sscanf的


FILE *fw = fopen("./tmptext","w+");
fprintf(fw, "%s", buf);
fseek(fw, 0L, SEEK_SET);
fscanf(fw, "%s", name);
while(!feof(fw))
{
        fscanf(fw, "%d", &pd);
        fscanf(fw, "%d", &filelen);
        fscanf(fw, "%d", &hitnum);
        while (hitnum--){
                int position;
                fscanf(fw, "%d", &position);
        }
        fscanf(fw, "%s", name);
}

这是fscanf的

[ 本帖最后由 kkndmammoth 于 2009-3-10 15:38 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-03-10 15:58 |只看该作者
fgets+sscanf逐行处理!

论坛徽章:
0
7 [报告]
发表于 2009-03-10 16:03 |只看该作者
为啥用fgets? 我就是不想用文件处理,最好直接在内存里面做了。

论坛徽章:
0
8 [报告]
发表于 2009-03-10 18:16 |只看该作者
Seek 到文件头,之前的数据还留了一部分在缓冲区里,考虑过这个影响没?另外,观察一下 CPU 占用率,如果这个数值保持在 100%,你就得仔细研究瓶颈在哪里。

论坛徽章:
0
9 [报告]
发表于 2009-03-10 21:54 |只看该作者
原帖由 langue 于 2009-3-10 18:16 发表
Seek 到文件头,之前的数据还留了一部分在缓冲区里,考虑过这个影响没?另外,观察一下 CPU 占用率,如果这个数值保持在 100%,你就得仔细研究瓶颈在哪里。


瓶颈确实是sscanf,我自己写了一个只取int和char的sscanf实现,比libc的快。

论坛徽章:
0
10 [报告]
发表于 2013-10-16 19:07 |只看该作者
sscanf调用了strlen,buf越长,则strlen耗得时间越多,且呈现雪崩效应。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP