經典問題之「分支預測」

問題

來源 :stackoverflow
為什么下面代碼排序后累加比不排序快?

public static void main(String[] args) {// Generate dataint arraySize = 32768;int data[] = new int[arraySize];Random rnd = new Random(0);for (int c = 0; c < arraySize; ++c)data[c] = rnd.nextInt() % 256;// !!! With this, the next loop runs fasterArrays.sort(data);// Testlong start = System.nanoTime();long sum = 0;for (int i = 0; i < 100000; ++i){// Primary loopfor (int c = 0; c < arraySize; ++c){if (data[c] >= 128)sum += data[c];}}System.out.println((System.nanoTime() - start) / 1000000000.0);System.out.println("sum = " + sum);}
復制代碼

在我電腦上沒有排序耗時:10.78390589
排序后耗時:4.552145206

出現上面這個時長差異的罪魁禍首就是這段代碼 :

if (data[c] >= 128)sum += data[c];
復制代碼

排序后數據的示例:

T = 表示進入分支
N = 表示未進入分支data[] = 0, 1, 2, 3, 4, ... 126, 127, 128, 129, 130, ... 250, 251, 252, ...
branch = N  N  N  N  N  ...   N    N    T    T    T  ...   T    T    T  ...= NNNNNNNNNNNN ... NNNNNNNTTTTTTTTT ... TTTTTTTTTT  (容易去預測)
復制代碼

沒有排序數據的示例:

data[] = 226, 185, 125, 158, 198, 144, 217, 79, 202, 118,  14, 150, 177, 182, 133, ...
branch =   T,   T,   N,   T,   T,   T,   T,  N,   T,   N,   N,   T,   T,   T,   N  ...= TTNTTTTNTNNTTTN ...   (全是隨機數據 - 很難去預測)
復制代碼

假如我們把代碼里條件判斷換成下面代碼:

int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
復制代碼

沒有排序耗時:2.698193263
排序后耗時 :2.753661927
說明沒有用到條件判斷語句沒有排序和排好序的耗時很相近。
在現代處理器中,都引入了分支預測來提高指令流水線的性能。所以就導致排序后比沒有排序快。

分支預測

條件分支指令通常具有兩路后續執行分支。即不采取(not taken)跳轉,順序執行后面緊挨JMP的指令;以及采取(taken)跳轉到另一塊程序內存去執行那里的指令。
是否需要跳轉,只有到真正執行時才能確定。如果沒有分支預測器,處理器將會等待分支指令通過了指令流水線的執行階段,才把下一條指令送入流水線的第一個階段—取指令階段(fetch stage),這種技術叫做 流水線停頓
分支預測器就是猜測條件判斷會走哪一路,如果猜對,就避免流水線停頓造成的時間浪費。如果猜錯,那么流水線中推測執行的那些中間結果全部放棄,重新獲取正確的分支路線上的指令開始執行,這導致了程序執行的延遲。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388013.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vi

vi filename :打開或新建文件&#xff0c;并將光標置于第一行首 vi n filename &#xff1a;打開文件&#xff0c;并將光標置于第n行首 vi filename &#xff1a;打開文件&#xff0c;并將光標置于最后一行首 vi /pattern filename&#xff1a;打開文件&#xff0c;并將光標置…

數字圖像處理 python_5使用Python處理數字的高級操作

數字圖像處理 pythonNumbers are everywhere in our daily life — there are phone numbers, dates of birth, ages, and other various identifiers (driver’s license and social security numbers, for example).電話號碼在我們的日常生活中無處不在-電話號碼&#xff0c;…

05精益敏捷項目管理——超越Scrum

00.我們不是不知道它會給我們帶來麻煩&#xff0c;只是沒想到麻煩會有這么多。——威爾.羅杰斯 01.知識點&#xff1a; a.Scrum是一個強大、特意設計的輕量級框架&#xff0c;器特性就是將軟件開發中在制品的數量限制在團隊層級&#xff0c;使團隊有能力與業務落班一起有效地開…

帶標題的圖片輪詢展示

為什么80%的碼農都做不了架構師&#xff1f;>>> <div> <table width"671" cellpadding"0" cellspacing"0"> <tr height"5"> <td style"back…

linux java 查找進程中的線程

這里對linux下、sun(oracle) JDK的線程資源占用問題的查找步驟做一個小結&#xff1b;linux環境下&#xff0c;當發現java進程占用CPU資源很高&#xff0c;且又要想更進一步查出哪一個java線程占用了CPU資源時&#xff0c;按照以下步驟進行查找&#xff1a;(一)&#xff1a;通過…

定位匹配 模板匹配 地圖_什么是地圖匹配?

定位匹配 模板匹配 地圖By Marie Douriez, James Murphy, Kerrick Staley瑪麗杜里茲(Marie Douriez)&#xff0c;詹姆斯墨菲(James Murphy)&#xff0c;凱里克史塔利(Kerrick Staley) When you request a ride, Lyft tries to match you with the driver most suited for your…

Sprint計劃列表

轉載于:https://www.cnblogs.com/zhs20160715/p/9953586.html

MySQL學習【第十二篇事務中的鎖與隔離級別】

一.事務中的鎖 1.啥是鎖&#xff1f; 顧名思義&#xff0c;鎖就是鎖定的意思 2.鎖的作用是什么&#xff1f; 在事務ACID的過程中&#xff0c;‘鎖’和‘隔離級別’一起來實現‘I’隔離性的作用 3.鎖的種類 共享鎖&#xff1a;保證在多事務工作期間&#xff0c;數據查詢不會被阻…

Android WebKit

這段時間基于項目需要 在開發中與WebView的接觸比較多&#xff0c;前段時間關于HTML5規范塵埃落定的消息出現在各大IT社區頭版上&#xff0c;更有人說&#xff1a;HTML5將顛覆原生App開發 雖然我不太認同這一點 但是關于HTML5JSCSSNative的跨平臺開發模式還是為很多企業節省了開…

jQuery的事件綁定和解綁

1、綁定事件 語法&#xff1a; bind(type,data,fn) 描述&#xff1a;為每一個匹配元素的特定事件&#xff08;像click&#xff09;綁定一個事件處理器函數。 參數解釋&#xff1a; type (String) : 事件類型 data (Object) : (可選) 作為event.data屬性值傳遞給事件對象的額外數…

軟件測試框架課程考試_那考試準備課程值得嗎?

軟件測試框架課程考試By Levi Petty李維佩蒂(Levi Petty) This project uses a public, synthesized exam scores dataset from Kaggle to analyze average scores in Math, Reading, and Writing subject areas, relative to the student’s parents’ level of education an…

開博第一天

開博第一天 紀念一下 轉載于:https://www.cnblogs.com/yang-9654/p/9959388.html

GitLab 11.9 正式發布,自動化工具 ChatOps 已開源

GitLab 11.9 已正式發布&#xff0c;該版本新增了兩個和安全相關的特性&#xff0c;一是快速檢查私密信息是否泄漏&#xff0c;從該版本起在 CI/CD 過程中會掃描開發者提交的信息是否包含私密內容&#xff0c;有的話會在合并 PR 時向開發者發送警報&#xff1b;二是改進了合并 …

DOCKER windows安裝

DOCKER windows安裝 DOCKER windows安裝 1.下載程序包2. 設置環境變量3. 啟動DOCKERT4. 分析start.sh5. 利用SSH工具管理6. 下載鏡像 6.1 下載地址6.2 用FTP工具上傳tar包6.3 安裝6.4 查看鏡像6.5 運行 windows必須是64位的 1.下載程序包 安裝包 https://github.com/boot2doc…

為什么在Python代碼中需要裝飾器

Python is praised for its clarity and syntactic sugariness. In this article, I will teach you to use decorators in Python to make your code readable and clean.Python的清晰性和語法含糖度受到贊譽。 在本文中&#xff0c;我將教您在Python中使用裝飾器&#xff0c;…

Elasticsearch Reference [6.7] ? Modules ? Network Settings

2019獨角獸企業重金招聘Python工程師標準>>> Search Settings Node Network Settingsedit Elasticsearch binds to localhost only by default. This is sufficient for you to run a local development server (or even a development cluster, if you star…

【百度】大型網站的HTTPS實踐(一)——HTTPS協議和原理

大型網站的HTTPS實踐&#xff08;一&#xff09;——HTTPS協議和原理 原創 網絡通信/物聯網 作者&#xff1a;AIOps智能運維 時間&#xff1a;2018-11-09 15:07:39 349 0前言 百度于2015年上線了全站HTTPS的安全搜索&#xff0c;默認會將HTTP請求跳轉成HTTPS。從今天開始&…

數據清理最終實現了自動化

蘋果 | GOOGLE | 現貨 | 其他 (APPLE | GOOGLE | SPOTIFY | OTHERS) Editor’s note: The Towards Data Science podcast’s “Climbing the Data Science Ladder” series is hosted by Jeremie Harris. Jeremie helps run a data science mentorship startup called Sharpest…

mui 與jquery 同時使用,$沖突解決辦法。

(function($,doc,$$) { 。。。。。 }(mui, document, jQuery)); 使用$$代替jQuery。 var $$jQuery.noConflict();此方法也可以 轉載于:https://www.cnblogs.com/mustanglqt/p/10608499.html

LVS原理介紹及安裝過程

一、ARP技術概念介紹 為什么講ARP技術&#xff0c;因為平常工作中有接觸。還有就是LVS的dr模式是用到arp的技術和數據。 1、什么是ARP協議 ARP協議全程地址解析協議&#xff08;AddressResolution Protocol&#xff0c;ARP&#xff09;是在僅知道主機的IP地址時確定其物理地…