C_and_CPP 板


LINE

※ 引述《tinlans ( )》之铭言: : 显然用 C++ 的 OO 机制是会比 C 的 OO 慢一点 : ( : 其实是因为我 C 的部分没有实作出 OO 特性, : 它是 static 语意 (要拔掉 union 然後用 void * 代替资料栏位), : 完全模拟 OO 的话那 0.2 秒的差异马上会不见, : 有人想战的话我再做细部实作 XD : ) 先不讨论它的 static 语意,在我看来把 function pointer 直接放 在 struct 中有太占空间的缺点,每增加一项操作,物件所占的空间 也会一起增加。 因此我把它改成使用 vtable 的版本: poly.c: struct Vtable; struct Data { struct Vtable* vptr; enum Type type; union Mixed mixed_data; }; struct Vtable { void (*changeValue)(struct Data *); int (*toInt)(struct Data *); }; client.c: int main(){ ... while(i--) (*data->vptr->changeValue)(data); ... } 有趣的是,这样改过以後,C 的版本依然比 C++ 快了一点。为了了 解它快在哪里,我编出了 assembly 并检视核心的回圈部份: C C++ .L2: │ .L4: movq (%rbp), %rax │ movq (%rbp), %rax addl $1, %ebx │ addl $1, %ebx movq %rbp, %rdi │ movq %rbp, %rdi call *(%rax) │ call *(%rax) cmpl $500000000, %ebx │ .LEHB2: jne .L2 │ cmpl $500000000, %ebx │ jne .L4 两边根本是一样的:this 放在 rbp 中,并取出 function pointer 放在 rax 内。那麽关键的 function 内容呢? double_change_value: │ _ZN6Double11changeValueEv: .LFB37: │ .LFB41: movsd .LC0(%rip), %xmm0 │ movsd .LC0(%rip), %xmm0 addsd 16(%rdi), %xmm0 │ addsd 8(%rdi), %xmm0 movsd %xmm0, 16(%rdi) │ movsd %xmm0, 8(%rdi) ret │ ret 唯一的差别是 16(%rdi) 与 8(%rdi),因为 member 在物件中的位置 不一样。我有想过也许是 alignment 的问题,因此多塞了一个变数进 class 中,使得两边的 assembly 完全相同。但测出来的时间并没有 任何改变。 这麽一来我就很不解了,速度到底是差在哪? --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.120.91
1F:→ suhorng:这一串讨论越来越没意义了... 03/08 12:48
2F:推 wowtiger:要不要测一下 alignment 32 XD 或者 64 如果有支援的话 03/08 12:52
3F:→ wowtiger:同样 CODE 不同效能的问题 我是查到记忆体位置问题啦 03/08 12:53
4F:推 herman602:谁寄信给Bjarne Stroustrup请他开释一下 03/08 13:48
5F:→ tinlans:不过我想强调的重点是,几乎不会有人在 kernel 用 C 写出 03/08 13:50
6F:→ tinlans:这样的东西,反倒是第一种 c + switch case + union 的居 03/08 13:51
7F:→ tinlans:多,但是那种写法通常比 C++ 用 vtable 跳还慢 XD 03/08 13:51
8F:→ tinlans:你真的想量回圈速度的话可能要用 getrusage() 抓比较准, 03/08 13:55
9F:→ tinlans:因为 C++ 进入 main 前做的事情跟 C 不一样。 03/08 13:56
10F:→ tinlans:anyway, 新版: http://tinyurl.com/cmpr8k XD 03/08 14:26
11F:推 yoco315:很有趣阿 03/08 14:28







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP