免费注册 查看新帖 |

Chinaunix

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

[其他] 列队欢迎,特别是编译器方面的,大牛:c or c++ lib?[非圣战贴] [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-02 17:02 |只看该作者 |倒序浏览
本帖最后由 robin10 于 2016-06-02 17:05 编辑

首先,这个贴不讨论C/C++哪个更好的问题。

其次,后面结论是建立在:相同功能(有一定规模的功能/函数,而不是单纯的一个赋值语句),c比c++的执行效率高的基础上的。
如果对这点持其他意见,可另开贴讨论。
本人不是做编译器方面工作的,也没有非常深入的去对比C,C++的效率问题,
仅仅是多年前的道听途说,以及随机的挑了2-3个小程序,对比一下C/C++编译后的汇编代码,
不太记得有没有选择O2之类的优化选项了,不过可以保证的是:
A,分别用c/c++实现了一些很 COMMON的函数,比如说,循环里面做一些计算之类的(不涉及到浮点数之类的)。
B,代码里面没有使用任何C/C++特有的属性。
简单来说,一样的代码,仅仅是类似于:
gcc a.c
g++ a.cpp
这样的区别,
如果我没记错的话,从反汇编代码的来看,C++里面的指令数的确是多了一点,但是相差不多,可能就2-5%吧。
由于当时是听到有人说:实现同一功能的C/C++程序(当然,里面肯定是使用了C++的一些属性的),C++比C的效率(or汇编指令)多30%左右。
出于仅仅是好奇,当时就找了/写了几个小程序,反汇编对比了一下汇编指令多少而已,并没有深入探究,如有错漏,欢迎指正。
---------------------------------------

言归正传,先交代一下背景:
1,需要提供一个函数库a 给第三方使用,windows下,对方调用的代码是c++;
2,函数库a,目前完全是用纯C的风格去实现,没有使用任何C++的属性、特性,但是保存为a.cpp,使用vs2010,vs2015编译出来的a.lib, a.dll。
3,目前是可以正常使用的,考虑到,a.dll里面的api,会被极其频繁的调用,并且api里面需要进行大量的内存拷贝,以及其他运算。
(有兴趣的兄弟可以参看另外一个帖子:http://bbs.chinaunix.net/thread-4246418-1-1.html,上面提及的是这个库里面的一个基本功能)

换句话来说,假设第三方出了一个程序a.exe,
那么运行的时候,可能70%左右的资源、运行 都是在a.dll里面提供的api实现的。

-------------------------
那么问题就来了:
情况1:
我们提供的是一个a.cpp编译出来的a.dll, 即是一个C++的库,
第三方公司还是使用C++的代码来调用这个库;
情况2:
我们仅仅是把a.cpp改成a.c,编译出一个纯C的库a.dll,
第三方公司还是使用C++的代码来调用这个库;

上述2种情况,会有效率上的区别吗?
请尽可能从原理方面分析,论证。
谢谢。

(回头有时间,可能我会用代码验证一下结论。)







论坛徽章:
146
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
2 [报告]
发表于 2016-06-02 17:07 |只看该作者
谢谢分享,期待更贴

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
3 [报告]
发表于 2016-06-02 19:22 |只看该作者
本帖最后由 wlmqgzm 于 2016-06-02 19:22 编辑

一般公司的编程规范的话, dll库如果能够做成c语言接口,  都是尽量做成这个格式的, 主要是为了兼容性, 因为C接口的格式, 通用性最强, 任何语言都可以对接.
这样能够最大限度复用.

说实话, 没有测试过, 但是, 个人依据经验判断 , 这种函数库a,目前完全是用纯C的风格去实现,没有使用任何C++的属性、特性,
判断代码的性能.c与..cpp是一致的, 没有区别, 没有听说改个后缀名, 性能有变化的.

C++慢最典型的场景是:
1)使用了虚函数面向对象编程的情况, 由于每次函数调用内部要查表找最终执行代码的地址, 造成函数性能大幅度降低.
2)大量小对象频繁调用, 造成小对象内存反复申请释放的场景. 另外小对象的创建和析构,  这些都会慢一点.

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
4 [报告]
发表于 2016-06-02 19:45 |只看该作者
恩~~对C++不熟悉,
不过感觉应该就是你说的这样的。
不清楚还有没有更多其他方面的因素?


BTW,如果我没有记错的话,
即使是相同的代码,用gcc, g++编译出来,再反汇编出来的结果,貌似也不太一致,但是差别极小。
当然,这个是几年前实验了一下的,说不定现在的编译器改版本了,或者是编译的时候使用高级一点的参数,可能最终出来的结果会是一样的。


另外一点,
即使是相同的代码,
汇编上有5%以下的指令差别(指CPU执行数量上的命令数目,比如说,实现同一个功能,C代码的程序需要100W mips, 而CPP代码的程序需要105W mips),
在目前的硬件条件上来看,这种差别也应该是可以忽略了的~


发这个贴,与其是说为了 提高库的效率, 还不如是说,想了解一下 ,一直传说的C/CPP效率方面到底是怎么回事。
相信我不是唯一一个好奇的~


回复 3# wlmqgzm


   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
5 [报告]
发表于 2016-06-02 20:33 |只看该作者
本帖最后由 robin10 于 2016-06-02 20:34 编辑

刚才小验证了一下,
同一份C风格的代码,http://bbs.chinaunix.net/thread-4246418-1-1.html 这份,
分别保存为 a.c, a.cpp,
Ubuntu 12.04, gcc 4.6.3, g++ 4.6.3

gcc -Wall -O2 a.c -o c.out
g++ -Wall -O2 a.cpp -o cpp.out
./c.out
./cpp.out
耗时可以认为是一致的。

objdump -S c.out >c_txt
objdump -S cpp.out >cpp_txt
得出来的汇编指令,行数大小了几乎是一致的,
虽然汇编的具体指令,不太一样,具体内容没细看。。

所以,目前的结论是,如果没有使用CPP特性,从机器指令来看,2者的效率,应该是几乎可以认为没区别的。
。。。。甚至,g++的优化也许会比gcc的好一点点也不好说(?这个不确定。不过从汇编代码来看,在我能看懂一点点点点的情况下,gcc,g++对代码的编译/优化策略,肯定是不太一样的)。

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
6 [报告]
发表于 2016-06-03 08:31 来自手机 |只看该作者
见过场面都晓得,ccpp那点事真不是个什么事情


应该多关心架构和算法,投入小收益大

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
7 [报告]
发表于 2016-06-06 19:04 |只看该作者
我只是做螺丝钉的,
上面架构那些对我来说太高级了~~

回复 6# shang2010


   

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
8 [报告]
发表于 2016-06-06 21:23 |只看该作者
回复 7# robin10


    没啥分享的,就是性能调优,什么配置参数
apache换nginx,去学习研究一两年,也就那些没啥含量
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP