电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

在什么情況下,Java比C++慢很多?

瀏覽:101日期:2022-09-06 08:10:40

問:在什么情況下,Java 比 C++ 慢很多?

答:Ben Maurer:

為了回答這個問題,需要先將該問題分成幾個可能引起慢的原因:

垃圾回收器。這是一把“雙刃劍”。如果你的程序遵循“大部分對象都在年青代中消亡”模型,垃圾回收器是非常有利的(很少的碎片,更好的緩存局部性)。但是,如果程序不遵循該模型,JVM將花費很多資源來回收堆內存。

大對象。在Java中,所有的對象都有一個vtable指針,而C++中使用POD結構沒有額外開銷。此外,所有的Java對象是可以被鎖定的。其實現依賴于JVM,這可能需要在對象中增加額外的字段。大對象 == 緩存更少的對象 == 更慢。(另一方面,Java 7 用64位記錄壓縮后的指針,這也是造成該問題的一部分原因。

缺乏內聯對象。在Java中,所有的類都是指針。在C++中,對象可以和其它對象一起分配,或者在棧上分配。這樣可以提高緩存的局部性,從而減少動態內存分配的開銷。

平臺函數調用。在Java中,JNI的調用或者將對象編譯成本地代碼都會帶來不小的開銷。如果你需要頻繁調用客戶端的C++代碼,會增加很大的開銷。

低效的強制抽象。例如,在Java中字符串是不可變的。如果你想寫一個XML分析器,你只使用String對象(沒有char[]),它將會很慢,因為需要分配額外的空間。

虛函數調用增加。JVM中,幾乎所有的函數調用都是虛函數調用。有許多代碼嘗試避免虛函數調用,但是很多場景下,JVM無法解決這個問題。這阻礙了代碼的內聯,使代碼變慢。

缺乏高級的編譯特征及轉為匯編的能力。 如果你寫了一段能從匯編得益的代碼Java可能表現不佳。

在我看來,最大的問題是垃圾回收。在程序中,強制在大的內存中進行多次完全GC,是最容易導致Java和C++之間產生鴻溝的原因之一。除此之外,如果將程序的工作集放在L2緩存之外,像大對象、缺乏內聯對象等問題,也會導致兩者之間的巨大差別。

低效的強制抽象和平臺函數也會導致速度下降,但是這通常只會因為低級的代碼才會產生。如果你使用寫得很好的Java代碼庫,這通常不是什么大問題。

答:Todd Lipcon

我基本同意Ben Maurer(hey Ben!)的回答。有幾個小點不同:

在最新的JVM中,當這種分配永遠不會從(a)局部函數或(b)局部線程逃逸出去的時候,逃逸分析能有效地決定一種固定分配。也就是說當分配不需要加鎖,通常是在自身的棧空間上進行的。這兩種情況下都是一種簡單的“指針碰撞(bump the pointer)”分配,這等同于C中的棧分配。

譯者注:

逃逸分析 Escape Analysis,是一種編譯優化技術,指分析指針動態范圍的方法。通俗地說,當一個對象的指針被多個方法或線程引用時,我們稱這個指針發生了逃逸。指針碰撞(bump the point)。假設Java堆中內存是絕對規整的,所有用過的內存都被放在一邊,空閑的內存被放在另一邊,中間放著一個指針作為分界點的指示器,那所分配內存就僅僅是把那個指針向空閑空間那邊挪動一段與對象大小相等的距離,這種分配方式稱為“指針碰撞”。

即使沒有逃逸分析,年青代的分配也是通過指針碰撞方式,在線程本地分配緩沖區(TLAB)中完成的,不需要進行同步。所以Java中小對象的分配有的時候比C語言實現的 malloc() 方式更快。更好的 malloc 方法像Google的 tcmalloc,采用了類似的方式。但是由于C語言無法在內存中對分配后的對象重新分配,所以某些方面會受到限制。

雖然存在內聯和虛函數問題,但是實際上,Java在某些情況下甚至可以做的比C更好。特別是,C不能通過動態鏈接功能來實現內聯,因為內聯是在編譯時期進行的,而不是運行時期。而Java可越過不同的類或庫的邊界來動態內聯一個函數,即使該類的真正實現在編譯期間還不可用。許多工作中,這種方式比C++的虛函數調用更有效,C++虛函數調用總是需要調用虛表。而JIT編譯器,如果之前動態屬性已經丟失(如新的類已經被加載),能夠聰明地取消內聯優化。

新版本的GCC提供一些這方面優化,稱為“全程序優化”或“鏈接時優化”(http://gcc.gnu.org/wiki/LinkTime…),允許在工程范圍內越過對象文件進行內聯。但是,基本上還是不允許通過動態鏈接的方式來實現內聯(如通過內聯的方式實現zlib的調用等)。許多大型項目都是通過復制標準庫的功能到它們的代碼中來實現。

原文鏈接: quora 翻譯: ImportNew.com

標簽: Java
主站蜘蛛池模板: 软膜天花_软膜灯箱_首选乐创品牌_一站式天花软膜材料供应商! | 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | 智慧钢琴-电钢琴-便携钢琴-数码钢琴-深圳市特伦斯乐器有限公司 | 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | R507制冷剂,R22/R152a制冷剂厂家-浙江瀚凯制冷科技有限公司 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 液压中心架,数控中心架,自定心中心架-烟台恒阳机电设计有限公司 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 协议书_协议合同格式模板范本大全| 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 服务器之家 - 专注于服务器技术及软件下载分享| 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | 锌合金压铸-铝合金压铸厂-压铸模具-冷挤压-誉格精密压铸 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 直读光谱仪,光谱分析仪,手持式光谱仪,碳硫分析仪,创想仪器官网 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 |