免费注册 查看新帖 |

Chinaunix

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

删帖吧 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-19 17:58 |只看该作者 |倒序浏览
本帖最后由 xyfree 于 2012-01-21 03:34 编辑

论坛徽章:
0
2 [报告]
发表于 2011-07-19 18:11 |只看该作者
跳转?你指的是jmp或者call指令吗?
调用虚函数并不需要两次跳转, 应该是两次寻址吧
再说obcj的语法那么丑, 再快也没用..

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2011-07-19 23:01 |只看该作者
如果在高速缓存中的方法选择,消息分发时间仅略高于一个函数调用。 ......
xyfree 发表于 2011-07-19 17:58


有看过测试代码吗?


我也听说过类似的测试结果, 对应的测试代码如下:

  1. clock_t t1 = clock();
  2. for (int i=0; i<很大一个数; ++i)
  3.    o.f();
  4. clock_t t2 = clock();
  5. clock_t elapsed = t2-t1;
复制代码
提问: 这有意义吗?

论坛徽章:
0
4 [报告]
发表于 2011-07-19 23:19 |只看该作者
回复 3# OwnWaterloo

patch

clock_t t1 = clock();
typeof(o) oxx[很大一个数]={};
for (int i=0; i<很大一个数; ++i)
   oxx[random()% 很大一个数].f()
clock_t t2 = clock();
clock_t elapsed = t2-t1;


提问: 这样测,有意义么?

论坛徽章:
0
5 [报告]
发表于 2011-07-19 23:48 |只看该作者
本帖最后由 wwwsq 于 2011-07-19 23:52 编辑

C++的虚函数调用比很多人想象的要慢很多,特别是在大型的复杂程序里面,vtable常常会导致cache不命中,破坏cpu执行流程,带来很多swap之类的操作。

所以,重视性能的话,考虑用函数指针吧。(告诉你们一个秘密,函数指针是可以指向class member function的,这对封装性很有好处)

另外,现在有一种观点是:尽量避免使用继承。原因不仅是性能,还有blah blah等等。。。。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2011-07-20 00:15 |只看该作者
回复 4# peidright

我的意思是这种比较很不公平。

实际上很多关于C++的比较都是这样。
总是构造一个对C++不利的环境, 然后吹嘘xx如何如何。
测试cache的性能却不提cache失效率与失效时的损失, 明显坑爹的。

真要测试, 我觉得可以:
1. 找一对与真实环境比较接近的程序
2. 在调用处插入代码, 记录 timestamp
3. 在入口点插入代码, 记录 timestamp
4. timestamp的精度要高, 记录也要迅速, 否则没意义了

以此测试分派所用的时间。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2011-07-20 00:34 |只看该作者
回复 5# wwwsq

你能给我说说, 为什么如下观点
1,vim、eclipse、vs、ue之类的编辑器都可以设置tab的宽度,保留tab宽度为8的那是sb,我们不需要为sb考虑太多。
wwwsq 发表于 2011-07-18 15:38


会与如下观点:
2,用空格做缩进,很容易导致代码对齐错误,比如多缩进一个空格,少缩进一个空格之类的。
3,用空格做缩进,当你修改一个函数的时候,你需要按四下箭头才能从行首移动到代码的第一个字母。
4,用空格做缩进,最后很容易变成缩进一个或者两个空格。
5,那些喜欢连续四个空格的人,我不知道他们已经多久没有亲手写过代码了。
以上。
wwwsq 发表于 2011-07-18 15:38

放在一起陈述?

难道缩进用的空格字符果真是用空格敲出来的

在我看来, 你这段话提到这些编辑器:
1. 表明它们可以设置tab stop
2. 表明你不会用它们


------ 上面看似跑题, 其实是下面的论据之一 ------


你能不能再教教我这个秘密
C++的虚函数调用比很多人想象的要慢很多,特别是在大型的复杂程序里面,vtable常常会导致cache不命中,破坏cpu执行流程,带来很多swap之类的操作。
所以,重视性能的话,考虑用函数指针吧。(告诉你们一个秘密,函数指针是可以指向class member function的,这对封装性很有好处)
wwwsq 发表于 2011-07-19 23:48


1. 函数指针如何在完成与虚函数相同功能的情况下, 避免性能问题?
2. 函数指针如何指向 non-static member function?
并且, 你在几种编译器下测试过这种转换
再者, 你敢保证其他编译器也一定能满足这一的转换
3. 封装是神马?
4. 这和封装又有神马关系?


------ 结论就是 ------

装装深沉也许能给你带来某种心理上的满足感?
但其实他人看来充满矛盾…… 与喜感! 我可以将你这些言论当笑料看吗?

中二病, 得治……

论坛徽章:
0
8 [报告]
发表于 2011-07-20 02:28 |只看该作者
本帖最后由 xyfree 于 2012-01-21 03:34 编辑

论坛徽章:
0
9 [报告]
发表于 2011-07-20 03:12 |只看该作者
本帖最后由 wwwsq 于 2011-07-20 09:13 编辑
回复  wwwsq

你能给我说说, 为什么如下观点


会与如下观点:

放在一起陈述?

难道缩进用的空 ...
OwnWaterloo 发表于 2011-07-20 00:34



1, 意思很简单,tab不要自动转成四个空格;保留'\t'但是宽度设为4。tab的问题还是到tab那个帖子里讨论吧。

2,函数指针和虚函数的性能问题,你自己去测试一下就知道了。提醒一下,函数指针可以是static的。
member function和non-static member function的区别需要我特别指出来吗?

论坛徽章:
0
10 [报告]
发表于 2011-07-20 03:18 |只看该作者
回复 7# OwnWaterloo


关于虚函数的调用消耗,你可以参考以下两篇文章:
http://blogold.chinaunix.net/u3/108641/showart_2127460.html
http://www.yitsoft.com/chap_study/ch_00021/ch_00021.asp

里面提到“虚函数的调用开销主要是3.4虚表查询”,这是正确的结论。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP