虚函数是不是比nintendo switch 快充更快

汉音对照 c++虚函数问题 c++ xu han shu wen ti - 王朝网络 -
| 分享&&&&&当前位置: &&&&&&&&&&&&&&&&&&&&c++虚函数问题 c++ xu han shu wen ti&&&本文为【】的汉字拼音对照版分类: 电脑/网络 && 程序设计 && 其他编程语言问题描述:  请qing问wenc++高gao手shou,虚xu函han数shu的de形xing式shi是shi怎zen样yang的de,其qi作zuo用yong是shi什shen么me?参考答案:  #include <iostream>  using std::cout;  using std::endl;  class Shape{  public:  function1(){   cout << "This is call Shape's function1!" << endl;
//这zhe里li并bing没mei有you用yong虚xu函han数shu,所suo以yi不bu能neng实shi现xian多duo态tai  }  virtual function2(){   cout << "This is call virtual function2 of Shape class!" << endl;
//这zhe里li用yong了le虚xu拟ni函han数shu,所suo以yi可ke以yi实shi现xian多duo态tai  }  };  class Rect: public Shape{  public:  function1(){   cout << "This is call Rect's function1!" << endl;
//不bu能neng实shi现xian多duo态tai  }  virtual function2(){   cout << "This is call virtual function2 of Rect class!" << endl;
//实shi现xian多duo态tai  }  };  class Circle: public Shape{  public:  function1(){   cout << "This is call Circle's function1!" << endl;
//不bu能neng实shi现xian多duo态tai   }  virtual function2(){   cout << "This is call virtual function2 of Circle class!" << endl;
//实shi现xian多duo态tai  }  };  int main()  {  Shape *shapeptr;  
Shape shape;  Rect rect;  Circle circle;  shapeptr = &shape;  shapeptr->function1();
//调tiao用yongShape类lei里li的de  shapeptr->function2();
//调tiao用yongShape类lei里li的de  
cout << endl;  shapeptr = ▭  shapeptr->function1();
//调tiao用yongShape类lei里li的de,因yin为wei该gai函han数shu不bu是shi虚xu函han数shu,所suo以yi不bu能neng实shi现xian多duo态tai  shapeptr->function2();
//调tiao用yongRect类lei里li的de,因yin为wei该gai函han数shu是shi虚xu函han数shu,实shi现xian了le多duo态tai  cout << endl;  shapeptr = &circle;  shapeptr->function1();
//调tiao用yongShape类lei里li的de,因yin为wei该gai函han数shu不bu是shi虚xu函han数shu,所suo以yi不bu能neng实shi现xian多duo态tai  shapeptr->function2();
//调tiao用yongRect类lei里li的de,因yin为wei该gai函han数shu是shi虚xu函han数shu,实shi现xian了le多duo态tai   
cout << endl;  return 0;  }  其qi实shi虚xu函han数shu的de作zuo用yong是shi代dai替ti了le一yi个geswitch结jie构gou,我wo们men的de基ji类lei指zhi针zhen可ke以yi指zhi向xiang派pai生sheng类lei对dui象xiang,而er在zai这zhe个ge过guo程cheng中zhong,虚xu函han数shu必bi须xu是shi指zhi针zhen所suo指zhi实shi际ji对dui象xiang的de类lei里li的de函han数shu,就jiu是shi刚gang才cai例li子zi里li我wo们men看kan到dao的de,指zhi针zhen是shi基ji类lei的de,而er指zhi向xiang派pai生sheng类lei对dui象xiang,但dan执zhi行xing时shi调tiao用yong的de是shi派pai生sheng类lei里li的de虚xu函han数shu,而er非fei虚xu汗han数shu,则ze调tiao用yong的de仍reng然ran是shi积ji累lei里li的de函han数shu     【】【】&&今日推荐
&&&&日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。
最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。
歌手:Def...老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...把牛仔裤磨出有线的破洞
1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...先来看下敬业福和爱国福
今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。
今天该活动正式启动,和去年一样,需要收集“五福”...有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。
1、很多人有这种习...简介
《极品家丁》讲述了现代白领林晚荣无意回到古代金陵,并追随萧二小姐化名“林三”进入萧府,不料却阴差阳错上演了一出低级家丁拼搏上位的“林三升职记”。...你就是我最爱的宝宝 - 李溪芮
(电视剧《极品家丁》片尾曲)
作词:常馨内
作曲:常馨内
你的眉 又鬼马的挑
你的嘴 又坏坏的笑
上一秒吵闹 下...乌梅,又称春梅,中医认为,乌梅味酸,性温,无毒,具有安心、除热、下气、祛痰、止渴调中、杀虫的功效,治肢体痛、肺痨病。乌梅泡水喝能治伤寒烦热、止吐泻,与干姜一起制...什么是脂肪粒
在我们的脸上总会长一个个像脂肪的小颗粒,弄也弄不掉,而且颜色还是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。
脂肪粒虽然也是由油脂...来源:中国青年报
新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...夫妻网络直播“造人”爆红
  1月9日,温岭城北派出所接到南京警方的协查通告,他们近期打掉了一个涉黄直播APP平台。而根据掌握的线索,其中有一对涉案的夫妻主播...如何防止墙纸老化?
(1)选择透气性好的墙纸
市场上墙纸的材质分无纺布的、木纤维的、PVC的、玻璃纤维基材的、布面的等,相对而言,PVC材质的墙纸最不透气...观点一:破日本销售量的“鲜肌之谜” 非日本生产
近一段时间,淘宝上架了一款名为“鲜肌之谜的” 鲑鱼卵巢美容液,号称是最近日本的一款推出的全新护肤品,产品本身所...系腰裙(北宋词人 张先)
惜霜蟾照夜云天,朦胧影、画勾阑。人情纵似长情月,算一年年。又能得、几番圆。
欲寄西江题叶字,流不到、五亭前。东池始有荷新绿,尚小如...关于女人的经典语句1、【做一个独立的女人】
思想独立:有主见、有自己的人生观、价值观。有上进心,永远不放弃自己的理想,做一份自己喜爱的事业,拥有快乐和成就...你想体验机器人性爱吗?你想和性爱机器人结婚吗?如果你想,机器人有拒绝你的权利吗?
近日,第二届“国际人类-机器人性爱研讨会”大会在伦敦金史密斯大学落下帷幕。而...10.土耳其地下洞穴城市
变态指数:★★☆☆☆
这是土耳其卡帕多西亚的一个著名景点,传说是当年基督教徒们为了躲避战争而在此修建。里面曾住着20000人,......据英国《每日快报》报道,一位科学家兼理论家Robert Lanza博士宣称,世界上并不存在人类死亡,死亡的只是身体。他认为我们的意识借助我们体内的能量生存,而且...《我爱狐狸精》 - 刘馨棋
  (电视剧《屏里狐》主题曲)
  作词:金十三&李旦
  作曲:刘嘉
  狐狸精 狐狸仙
  千年修...·&·&·&·&·&·&·&·&·&·&&&[b]分类:[/b] 电脑/网络 && 程序设计 && 其他编程语言[br][b]问题描述:[/b][br]请问c++高手,虚函数的形式是怎样的,其作用是什么?[br][b]参考答案:[/b][br]#include &iostream&
using std::
using std::
class Shape{
function1(){
cout && "This is call Shape's function1!" &&
//这里并没有用虚函数,所以不能实现多态
virtual function2(){
cout && "This is call virtual function2 of Shape class!" &&
//这里用了虚拟函数,所以可以实现多态
class Rect: public Shape{
function1(){
cout && "This is call Rect's function1!" &&
//不能实现多态
virtual function2(){
cout && "This is call virtual function2 of Rect class!" &&
//实现多态
class Circle: public Shape{
function1(){
cout && "This is call Circle's function1!" &&
//不能实现多态
virtual function2(){
cout && "This is call virtual function2 of Circle class!" &&
//实现多态
int main()
shapeptr = &
shapeptr-&function1();
//调用Shape类里的
shapeptr-&function2();
//调用Shape类里的
shapeptr = &
shapeptr-&function1();
//调用Shape类里的,因为该函数不是虚函数,所以不能实现多态
shapeptr-&function2();
//调用Rect类里的,因为该函数是虚函数,实现了多态
shapeptr = &
shapeptr-&function1();
//调用Shape类里的,因为该函数不是虚函数,所以不能实现多态
shapeptr-&function2();
//调用Rect类里的,因为该函数是虚函数,实现了多态
其实虚函数的作用是代替了一个switch结构,我们的基类指针可以指向派生类对象,而在这个过程中,虚函数必须是指针所指实际对象的类里的函数,就是刚才例子里我们看到的,指针是基类的,而指向派生类对象,但执行时调用的是派生类里的虚函数,而非虚汗数,则调用的仍然是积累里的函数
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&&&为你推荐&&&&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容··········&&&&&&&&&频道精选&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&&2005-&&版权所有&温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(896)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'C++ 继承、虚函数 多态(virtual)模板',
blogAbstract:'通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。归根到底是代码复用 C++虚继承的作用:C++虚继承可以防止多重继承产生的二义性问题。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:2,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}博客访问: 421640
博文数量: 171
博客积分: 2998
博客等级: 少校
技术积分: 1642
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
虚函数的运行机制:如果基类中的非静态成员函数被定义称虚函数,且当派生类重写了基类的虚函数,,当通过指向基类对象的指针或引用 调用派生类对象中的虚函数时,就会调用到该指针(或引用)实际所指对象的成员函数虚函数只能是类的成员函数,不属于任何类的普通成员函数不能定义称虚函数。虚函数相关的代码书上有,网络上也有。至于使用虚函数跟不使用虚函数的差别,以及虚函数带来的开销,可能例子少了一点。举个例子:C/C++ code//
//一个提供功能的继承体系,和一个使用者
//非虚拟继承的实现
#include <iostream>
//////////////////////////////////////////////////////////
class Base
Base(int type) : type(type)
void commonjob()
cout << "commonjob" <<
void personjob();
int//标识,用于区分不同的派生类
class Derived_a :
public Base
Derived_a():Base(1)//派生类类型1
void personjob()
cout << "Derived_a::personjob" <<
class Derived_b : public Base
Derived_b() : Base(2)//派生类类型2
void personjob()
cout << "Derived_b::personjob" <<
//////////////////////////////////////////////////////////
class User
void dojob(Base* bobj)
bobj->commonjob();
switch(bobj->type)
((Derived_a*)bobj)->personjob();
((Derived_b*)bobj)->personjob();
//////////////////////////////////////////////////////////
int main()
User user_
Derived_a a_
Derived_b b_
cout << "--------test a--------" <<
user_obj.dojob(&a_obj);
cout << "--------test b--------" <<
user_obj.dojob(&b_obj);
--------test a--------
Derived_a::personjob
--------test b--------
Derived_b::personjob
2、使用虚函数C/C++ code//
//一个提供功能的继承体系,和一个使用者
//虚拟继承的实现
#include <iostream>
//////////////////////////////////////////////////////////
class Base
void commonjob()
cout << "commonjob" <<
virtual void personjob() = 0;
class Derived_a :
public Base
void personjob()
cout << "Derived_a::personjob" <<
class Derived_b : public Base
void personjob()
cout << "Derived_b::personjob" <<
//////////////////////////////////////////////////////////
class User
void dojob(Base* bobj)
bobj->commonjob();
bobj->personjob();
//////////////////////////////////////////////////////////
int main()
User user_
Derived_a a_
Derived_b b_
cout << "--------test a--------" <<
user_obj.dojob(&a_obj);
cout << "--------test b--------" <<
user_obj.dojob(&b_obj);
--------test a--------
Derived_a::personjob
--------test b--------
Derived_b::personjob
分析:通过那两个例子可以简单看出,当使用了虚函数的时候看起来比较简洁,便于阅读。使用了虚函数,编译器会提供很多有用的支持。性能分析:使用了虚函数之后带来的开销:1、继承体系中每一个类的虚函数表空间开销。2、每一个对象的虚函数表指针空间开销。3、每一次生成一个类都要去初始化虚函数表指针的时间开销。4、每一次虚函数的调用都要通过虚函数表指针去访问虚函数表然后再调用函数,几经周折的时间开销。5、使用虚函数之后不能使用内联函数。比较:不使用虚函数表的性能开销1、没有虚函数表空间开销。2、有一个派生类类型标识的变量type的开销。3、需要初始化type变量。4、需要switch确定调用哪一个派生类的函数。5、可以使用内联函数。从简单的时间和空间开销上来说,虚函数比非虚函数多带来的坏处是:1、虚函数表的空间开销;2、无法使用内联函数。但是从业务逻辑上来说,使用虚函数好处非常突出。当继承体系中增加了派生类时,不需要修改使用者的代码。如果不使用虚函数,当继承体系中的派生类增加的时候,必须修改使用者的代码,这样的设计增加了代码的耦合度,模块化很差,不便于扩展、维护。面向对象编程一个重要的目的是可扩展和可维护,当业务逻辑改变时对源程序的修改要尽可能的方便。显然从程序设计的角度来说使用虚函数好很多。参考《C
应用程序性能优化》第二章 http://topic.csdn.net/u//990fbc1d-e7b7-4c3e-ab64-d02d3942876d.html
阅读(2467) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。LLVM的总结
时间: 14:15:51
&&&& 阅读:221
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&LLVM
写在前面的话:无意中看到的LLVM的作者Chris Lattner相关的介绍和故事,觉得很有意思就贴上来,如果不感兴趣,可以直接跳入下一章。
如果你对LLVM的由来陌生,那么我们先来讲讲最近编程语言的新贵&swift。
2010 年的夏天,Chris Lattner 接到了一个不同寻常的任务:为 OS X 和 iOS 平台开发下一代新的编程语言。那时候乔布斯还在以带病之身掌控着庞大的苹果帝国,他是否参与了这个研发计划,我们不得而知,不过我想他至少应该知道此事,因为这个计划是高度机密的,只有极少数人知道,最初的执行者也只有一个人,那就是 Chris Lattner。
从 2010 年的 7 月起,克里斯(Chris)就开始了无休止的思考、设计、编程和调试,他用了近一年的时间实现了大部分基础语言结构,之后另一些语言专家加入进来持续改进。到了 2013 年,该项目成为了苹果开发工具组的重中之重,克里斯带领着他的团队逐步完成了一门全新语言的语法设计、编译器、运行时、框架、IDE 和文档等相关工作,并在 2014 年的 WWDC 大会上首次登台亮相便震惊了世界,这门语言的名字叫做:「Swift」。
根据克里斯个人博客(http://nondot.org/sabre/ )对 Swift 的描述,这门语言几乎是他凭借一己之力完成的。这位著名的 70 后程序员同时还是 LLVM 项目的主要发起人与作者之一、Clang 编译器的作者,可以说 Swift 语言和克里斯之前的软件作品有着千丝万缕的联系。
克里斯可以说是天才少年和好学生的代名词,他在 2000 年本科毕业之后,继续攻读计算机硕士和博士。但克里斯并不是宅男,学习之余他手捧「龙书」游历世界,成为德智体美劳全面发展的好学生。之后就是一篇又一篇的发表论文,硕士毕业论文即提出了一套完整的运行时编译思想,奠定了 LLVM 的发展基础,读博期间 LLVM 编译框架在他的领导下得到了长足的发展,已经可以基于 GCC 前端编译器的语义分析结果进行编译优化和代码生成,所以克里斯在 2005 年毕业的时候已经是业界知名的编译器专家了。
克里斯毕业的时候正是苹果为了编译器焦头烂额的时候,因为苹果之前的软件产品都依赖于整条 GCC 编译链,而开源界的这帮大爷并不买苹果的帐,他们不愿意专门为了苹果公司的要求优化和改进 GCC 代码,所以苹果一怒之下将编译器后端直接替换为 LLVM,并且把克里斯招入麾下。克里斯进入了苹果之后如鱼得水,不仅大幅度优化和改进 LLVM 以适应 Objective-C 的语法变革和性能要求,同时发起了 CLang 项目,旨在全面替换 GCC。这个目标目前已经实现了,从 OS X10.9 和 XCode 5 开始,LLVM+GCC 已经被替换成了 LLVM+Clang。
Swift 是克里斯在 LLVM 和 Clang 之后第三个伟大的项目!
代码生成(LLVM)
对于一个query,优化执行性能的最理想状态,就是创造一个应用,只支持这个query的数据格式,和查询类型。
举例来说,最理想的状态下,执行一下query的速度:
select count(*) from tbl where col like %XYZ%
grep -c "XYZ" tbl
是相同的。
考虑另一个query:select sum(col) from tbl。如果表只有一列,类型是int64,可以用一下代码执行:
int64_t sum=0;
&&& int64_t* values = (int64_t*)
&&& for (int i=0; i & num_ ++i) {
&&& &&&&& sum += values[i];
用以上两种方式执行query,通常比在通用的queryengine里执行要快的多(不考虑database使用索引等优化技术)。这主要是因为目前的queryengine存在以下的开销:
虚函数调用:
在不使用代码生成技术的情况下,表达式的求值过程中通常需要调用虚函数,例如eval。这主要取决于系统的实现,通常来说,总会有一群operator类,每一个operator类都会实现eval函数。在这种情况下,表达式计算本身的开销很小,而虚函数调用带来的开销通常就会比较大。
大量的switch case代码,需要对类型等进行判断:
尽管分支预测技术可以缓解这个问题,但是分支指令依然会降低执行pipeline的效率,以及影响指令级并行。
无法通过使用常量提高性能:
在Impala中,每一个tuple的的长度在编译时就已经计算好。例如col3在tuple中的offset时16。如果把这些常量写入代码中,则可以减少额外的内存访问的开销。
代码生成的目标就是,对每一个query,都使用和定制程序几乎相同的指令数,并得到相同的结果。避免因为支持更多的功能而导致的额外开销。
LLVM(Low Level Virtual Machine)是一组库,包含了编译器的building blocks。主要的模块包括:
&& AST -& IR generation
&& IR -& machine code generation
LLVM的IR和Java的byte code很类似。IR一种二进制语言,LLVM把IR当作其内部模块的输入和输出LLVM也提供更高级的code object(instruction object,function object),使得可以更方便的对IR进行编程。包括对函数进行inline,移除指令,用常量替代一个计算,等等。Impala用到了LLVM中的IR优化,以及IR生成机器码。
除了LLVM,还有其他的生成代码的方式,但LLVM的效果更好:
l& 直接生成可以执行的机器码:
尽管这个过程速度很快,但是生成机器码很容易出错,也很复杂,尤其是当函数数量增加时。同时,这种方法也无法享受编译器优化带来的性能提升。
l& 生成c++代码,编译,并动态加载:
这种方法生成的代码可以经过编译器优化,并且生成高级语言相对简单。但通常编译c++代码需要几秒的时间,是比较慢的。
在进行完语意分析后,impala为每一个独立的操作生成其kernal代码。在代码生成时,由于已经知道了数据的类型,数据的layout。所以生成的代码中,会对循环等进行很多的优化。
LLVM提供两种生成IR的机制。1)使用IrBuilder API;2)使用clang编译器。这两种方法Impala都用到了。
使用IrBuilder生成IR
加载已经编译好的IR,仅加载query需要的函数。
把1和2的结果combine到一起。
通过LLVM的优化器,对IR进行优化。
JIT compile,把优化后的IR编译成机器码。LLVM会把它以函数指针的形势返回。
&&& l_returnflag,
&&& l_linestatus,
&&& sum(l_quantity),
&&& sum(l_extendedprice),
&&& sum(l_extendedprice * (1 - l_discount)),
&&& sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)),
&&& avg(l_quantity),
&&& avg(l_extendedprice),
&&& avg(l_discount),
&&& count(1)
tpch.lineitem
&&& l_shipdate&=‘‘
&&& l_returnflag,
&&& l_linestatus
Impala会将这个query编译成一个算子树。对这个query来说,会有两个算子:scan算子,用于读取输入数据;聚合算子,计算sum和avg。
下图时执行结果对比:
对于两种不同的dataset,性能头提高了3倍。而代码生成消耗的时间大概为150s。代码生成消耗的时间和采用的优化选项有很大关系。可以在impala shell中,使用set命令查看优化选项。
下表是更详细的对比:
可以看到,采用代码生成可以减少一半的指令和一半的branch miss。
我们在代码生生成上投入的精力已经得到了回报。随着我们继续的改进,我们期望得到更大的性能提升。列存储,更高效的编码方式,以及更大的缓存,这些技术会提高IO的性能。这时候,CPU的效率就将变得更加重要。
代码生成对于简单的query,带来的性能提升会更明显。对于query中带有复杂操作的,例如正则表达式,则性能提升会不那么显著。因为相对来说,正则表达本身的计算会占用更多时间。
&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/chengyeliang/p/4123010.html
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!}

我要回帖

更多关于 eclipse switch快捷键 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信