免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: qfmeal
打印 上一主题 下一主题

生成文件解决方案 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-07-17 12:19 |只看该作者
搞得太复杂了,就用strcat一行行就可以了,然后sprintf出来,简单清晰容易维护。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
12 [报告]
发表于 2012-07-17 16:43 |只看该作者
本帖最后由 yulihua49 于 2012-07-17 16:46 编辑
hdmi2009 发表于 2012-07-17 12:19
搞得太复杂了,就用strcat一行行就可以了,然后sprintf出来,简单清晰容易维护。

当然,不过楼主的问题没解决。
实际上我们开发出这一套工具,之后的N年受益匪浅。
程序简单易读,逻辑清晰。库函数无需维护,尽管用。
strcat效率太低,尤其是长行。
pkg_pack内部基本上不使用strcat,新版本连printf也不使用。
采用stpcpy一类的返回尾部的函数,串接的非常快。

论坛徽章:
0
13 [报告]
发表于 2012-07-17 17:26 |只看该作者
回复 12# yulihua49
要追求效率用汇编岂不更快?高级语言考虑的应该易读易修改优先,其次是效率。而且按照现在电脑速度,每秒处理百万字符串很容易。慢一点不怕。

比如程序改为

char *dst = malloc(4096);

*dst= 0;
strcat (dst,a1);strcat (dst,"|");
strcat (dst,a2);strcat (dst,"|");
strcat (dst,a3);strcat (dst,"|");
strcat (dst,a4);strcat (dst,"|");
strcat (dst,a5);strcat (dst,"\r\n");

最简单,刚学C的也能轻易看懂。插入修改也很容易。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
14 [报告]
发表于 2012-07-19 12:59 |只看该作者
本帖最后由 yulihua49 于 2012-07-19 13:10 编辑
hdmi2009 发表于 2012-07-17 17:26
回复 12# yulihua49
要追求效率用汇编岂不更快?高级语言考虑的应该易读易修改优先,其次是效率。而且按照 ...

这不是汇编不汇编的问题,反复的数字节谁效率都高不了。
我弄过100M的字符串stacat时间太长了,成了系统瓶颈。
那次是组织一个select的结果集。
还有:
char *cp=buf;
cp+=sprintf(cp,"%s|",s.a);
cp+=sprintf(cp,"%s|",s.b);
cp+=sprintf(cp,"%d|",s.c);
cp+=sprintf(cp,"%f|",s.d);

你认为这东西好维护吗?数据结构改了怎么办?这种代码在程序中大量重复,改一漏万,需要仔细。

论坛徽章:
0
15 [报告]
发表于 2012-07-20 12:43 |只看该作者
回复 14# yulihua49
我觉得挺好维护。各人有各人风格。不过你搞出一个 100M的字符串干什么?打印出来都消耗几十万张纸吧。而且这么大的字符串必定是通过循环什么做出来的,不可能是我那种手写的方式能搞出来的。手写的方式也没有几行,那里还需要考虑100M字符串那种效率问题。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
16 [报告]
发表于 2012-07-21 11:01 |只看该作者
本帖最后由 yulihua49 于 2012-07-21 11:27 编辑
hdmi2009 发表于 2012-07-20 12:43
回复 14# yulihua49
我觉得挺好维护。各人有各人风格。不过你搞出一个 100M的字符串干什么?打印出来都消 ...

做一个通用的SQL服务器,其中一个功能是接受SQL语句,返回结果集。语句是客户端提交过来的。
结果集返回协议的设计没有做成多批返回(那样就成了有状态服务),结果,结果集的规模就不可控了,多大的字符串都可能产生。


在这个过程中,strcat的性能就很瓶颈。
我没有强迫你接受我的观点,我只是告诉你有这么一种情况,需要高性能的字符串组接工具。

char *cp=buf;

cp=stpcpy(cp,string1);
cp=stpcpy(cp,string2);
.......

高性能的字符串组接方法,用于组接SQL语句:
stpcpy(stpcpy(buf,string1),string2);

8楼的那个数据结构,应用户要求改变了,就在这两天。
重新生成模板,程序基本没动,编译一下就改完了。
同时改变的还有好几个表,涉及整个开发组,没费事都搞定了。
不用模板哪这么方便。
这种在开发中途改变业务逻辑和数据结构,是经常发生的,程序的适应性很必要。

论坛徽章:
0
17 [报告]
发表于 2012-07-26 12:50 |只看该作者
回复 16# yulihua49

你那100M字符串的出现纯粹是考虑不周导致的bug.你的解决办法也不是采用了什么高性能字符串处理工具搞定的。你的那个bug 就像我用google搜索一个关键字,google一页返回100万个结果,然后我的浏览器就死了一样。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
18 [报告]
发表于 2012-07-26 16:42 |只看该作者
本帖最后由 yulihua49 于 2012-07-26 16:45 编辑
hdmi2009 发表于 2012-07-26 12:50
回复 16# yulihua49

你那100M字符串的出现纯粹是考虑不周导致的bug.你的解决办法也不是采用了什么高性能 ...

你坚持你的观点好了,我又没强迫你接受我的观点。
我的程序是尽力而为,系统有多大内存就给多大结果,谈不上bug。
现在是64位时代了,充分发挥64位的地址空间。在这么大的尺度上,strcat、strlen不能满足性能要求。我这100M还是小朋友了,
若干G的字符串也是可能的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP