cs app深入理解計算機系統:第五章 優化程式效能 幾個優化的java實現
package combine; import java.util.Random; /** * csapp優化程式效能從不同角度 * @author Administrator * */ public class Combine { static double combine1(Data data) {//初始版本 data.sum[0]=1; for (int i = 0; i < data.a.length; i++) { double val; val = data.getElement(data, i); data.sum[0]=data.sum[0]+val; } return 0; } static double combine2(Data data) {//用l替代data.a.length data.sum[1]=1; int l = data.a.length; for (int i = 0; i < l; i++) { double val; val = data.getElement(data, i); data.sum[1]=data.sum[1]+val; } return 0; } static double combine3(Data data) {//用double a[]儲存data.a data.sum[2]=1; int l = data.a.length; double a[] = data.a; for (int i = 0; i < l; i++) { data.sum[2]=data.sum[2]+a[i]; } return 0; } static double combine4(Data data) {//data.sum[0]替換成s data.sum[3]=1; int l = data.a.length; double a[] = data.a; double s = 1; for (int i = 0; i < l; i++) { s+=a[i]; } data.sum[3] = s; return 0; } static double combine5(Data data) {//迴圈展開 int l = data.a.length; int limit = l-1; double a[] = data.a; double s = 1; int i = 0; for (; i < limit; i+=2) { s=(s+a[i])+a[i+1]; } for (; i < l; i++) { s=s+a[i]; } data.sum[4] = s; return 0; } static double combine6(Data data) {//多個累計變數 int l = data.a.length; int limit = l-1; double a[] = data.a; double s1 = 1; double s2 = 0; int i = 0; for (; i < limit; i+=2) { s1 = s1 + a[i]; s2 = s2 + a[i+1]; } for (; i < l; i++) { s1=s1+a[i]; } data.sum[5] = s1+s2; return 0; } static double combine7(Data data) {//重新結合變換 double d[]=data.a; int l = d.length; int limit = l-1; double s=1; int i = 0; for (; i < limit; i+=2) { s=s+(d[i]+d[i+1]);//d[i]+d[i+1]和s累加可並行 } for (; i < l; i++) { s+=d[i]; } data.sum[6]=s; return s; } public static void main(String[] args) { int n = 300000000; Data data = new Data(n); CalTime.start(); combine1(data); long t1 = CalTime.end(); CalTime.start(); combine2(data); long t2 = CalTime.end(); CalTime.start(); combine3(data); long t3 = CalTime.end(); CalTime.start(); combine4(data); long t4 = CalTime.end(); CalTime.start(); combine5(data); long t5 = CalTime.end(); CalTime.start(); combine6(data); long t6 = CalTime.end(); CalTime.start(); combine7(data); long t7 = CalTime.end(); for (int i = 0; i < data.sum.length; i++) { System.out.println(data.sum[i]); } System.out.println(t1+" "+t2+" "+t3+" "+t4+" "+t5+" "+t6+" "+t7); } }
儲存隨機數的Data類:
計算時間類:package combine; import java.util.Random; public class Data { double a[]; double sum[]; public Data(int n) { Random random = new Random(System.currentTimeMillis()); a = new double[n]; sum = new double[7]; for (int i = 0; i < n; i++) { a[i] = random.nextInt(n); } } double getElement(Data data,int index){ if(index<0||index>=data.a.length){ return 0; } return data.a[index]; } }
package combine;
public class CalTime {
private static long timeStart;
public static void start() {
timeStart = System.currentTimeMillis();
}
public static long end(){
return System.currentTimeMillis()-timeStart;
}
}
多次執行得到執行時間:t1~t7:
290 288 284 277 276 198 194
289 284 282 275 277 195 192
289 284 282 281 277 194 191
可以看到加速比在n=300000000下才在1.51這樣。。。。
書上用c可以從combine1的10CPE(每元素週期)下降到combine7的0.8CPE,
不懂哪裡不對。。
相關推薦
cs app深入理解計算機系統:第五章 優化程式效能 幾個優化的java實現
package combine; import java.util.Random; /** * csapp優化程式效能從不同角度 * @author Administrator * */ public class Combine { static double
讀書筆記——《深入理解計算機系統》第三章_程式的機器級表示(一)
前言:已經大四,沒有去找工作,選擇了保研,之所以這樣選擇,有三個原因,一、剛進校時,聽說保研都是牛人才能行的事,所以一心努力保研;二、2008年開始,經濟危機比較嚴重,工作不好找,雖然軟體專業要找一份工作還是比較容易,但好工作的機會少了很多,再多學習幾年,規避下風險;
深入理解計算機系統_3e 第四章家庭作業(部分) CS:APP3e chapter 4 homework
ray design sed copy default ror this 處理 implement 4.52以後的題目中的代碼大多是書上的,如需使用請聯系 [email protected] 流水線部分只寫了偶數題號的,這幾天太浮躁,落下了好多課。。。 4.
深入理解計算機系統_3e 第八章家庭作業 CS:APP3e chapter 8 homework
fig lar man message -- ali rail raise mat 8.9 關於並行的定義我之前寫過一篇文章,參考: 並發與並行的區別 The differences between Concurrency and Parallel +----------
《深入理解計算機系統》第三章學習筆記
並發 錯誤 ia32 庫函數 容易 簡單 linux 嚴重 格式 通過本周的學習,總結出一下知識內容 機器級代碼 計算機系統使用了多種不同形式的抽象,利用更簡單的抽象模型來隱藏實現的細節。 對於機器級編程來說,其中兩種抽象尤為重要: 1、指令集體系結構(Instructio
2018-2019-1 20189215 《深入理解計算機系統》第三章學習總結
《第3章 程式的機器級表示》 彙編程式碼是機器程式碼的文字表示,是與特定機器密切相關的。用高階語言編寫的程式可以在很多不同的機器上編譯和執行。 3.2 程式編碼 彙編程式碼表示非常接近於機器程式碼。與機器程式碼的二進位制格式相比,彙編程式碼的主要特點是它用可讀性更好的文字格式表示,能
《深入理解計算機系統》——第7章(連結)
連結 連結:將各種程式碼和資料部分收集起來並組合成為一個單一檔案的過程。(這個檔案可被載入或拷貝到儲存器並執行) 連結可以執行於編譯,載入或執行時。 靜態連結: 兩個主要任務: 1 符號解析:將目標檔案中的每個全域性符號都繫結到一個唯一的定義 2 重
深入理解計算機系統_3e 第十一章家庭作業 CS:APP3e chapter 11 homework
cep serve 技術分享 apn only class control 相同 法則 註:tiny.c csapp.c csapp.h等示例代碼均可在Code Examples獲取 11.6 A. 書上寫的示例代碼已經完成了大部分工作:doit函數中的printf("%
速讀《深入理解計算機系統(第三版)》問題及解決
情況 csdn 第六章 填充 以及 函數 順序 時鐘 管理所 第一章 計算機漫遊 P13:用戶棧和運行時堆有什麽區別?數據結構中經常說堆棧,這裏的堆和棧一樣嗎?和操作系統的堆、棧有什麽區別? 參考:堆和棧的區別(內存和數據結構) 操作系統: 棧:由操作系統自動分配釋放
20179215《深入理解計算機系統(第三版)》第三章
imu 組成 不但 圖片 想是 運行 href com 語言 《深入理解計算機系統》第三章 程序的機器級表示學習 讀書筆記 一、這章主要任務: ? 二、程序編碼 ?計算機系統使用了多種不同形式的抽象,利用更簡單的抽象模型來隱藏實現的細節。對於機器級編程來說,其中兩種抽
《深入理解計算機系統(第三版)》第二章學習總結
第二章:資訊的表示和處理 1.二進位制與十六進位制: ①十六進位制數字:0 – F,例子:25A4B ② 二進位制數字:0 – 1,例子:0001 0111 0011 1010 0100 1100 ③相互轉換:十進位制→ 十六進位制:Mod(10,16)(倒序排列) 2.字和資料大小: ① 字長決定了
2018-2019-1 20189221 《深入理解計算機系統》第 2 周學習總結
2018-2019-1 20189221 《深入理解計算機系統》第 2 周學習總結 《深入理解計算機系統》第二章 本章講述了計算機的算術運算,重點描繪了無符號數和數的補碼錶示的特性。 資訊儲存 計算機字長,指明指標資料的標稱大小。32位機器虛擬地址空間為4GB。64位為16EB。64位機器可以執行32
2018-2019-1 20189221 《深入理解計算機系統》第 1 周學習總結
2018-2019-1 20189221 《深入學習計算機系統》第 1 周學習總結 第 1 章 計算機系統漫遊 這一章通過研究“hello,world”這個簡單程式的生命週期,介紹計算機系統的主要概念和主題 1.1 資訊就是位+上下文 計算機系統中的一切資料都是由一串位元表示的,區分不同資
2018-2019-1 20189221 《深入理解計算機系統》第 3 周學習總結
2018-2019-1 20189221 《深入理解計算機系統》第 3 周學習總結 第 3 章 程式的機器級表示 計算機執行機器程式碼,用位元組序列編碼低階的操作,包括處理資料、管理記憶體、讀寫儲存裝置上的資料,以及利用網路通訊。編譯器基於程式語言的規則、目標機器的指令集和作業系統遵循的慣例,經過一系列的
深入理解計算機系統_第零部分_第一章_計算機系統漫遊
深入,並且廣泛 -沉默犀牛 寫在前面 今天是2018/12/14,還有一週我的實習期就結束了,發現自己的基礎特別薄弱,選了幾本提升基礎的書籍,《深入理解計算機系統》是我將要看的第一本書,特別開這個系列文章,記錄所學所得所想,也用作檢驗自己學習進度的指標之一。 PS:大部分是
《深入理解計算機系統》(第三版)第二章部分知識點總結
資訊的表示和處理 本渣渣要進行CSAPP期中考了,但是上半學期啥也沒聽QWQ,只能臨陣磨槍了*學習要點*1、計算機如何表示數字2、其他形式資料的基本屬性*資訊儲存*位元組:最小的可定址的記憶體單位地址:記憶體中每個位元組都由一個唯一的數字來標識虛擬地址空間:所有可能
深入理解計算機系統(第三版)隨書原始碼下載
csdn上面好多都需要積分才能下載,最後發現官網上面提供了隨書原始碼的下載。 官網的下載地址: 也提供一個百度網盤的下載,網盤裡面只有套接字部分的程式碼,因為我現在只需要這一塊的程式碼,所以只下載了這一塊的程式碼。 連結:https://pan.baidu.
深入理解計算機系統:C語言檔案的連結原理
在這篇blog裡,你將瞭解到以下的內容: 1. 一個.c檔案是怎麼變成一個可執行檔案,中間會產生那幾種檔案,在執行的時候又是怎麼被載入進作業系統的? 2. 在形成這些不同檔案的過程中,即連結的過程中,容易誘發那幾種問題,誘發這些問題的原因是什麼,如何避免這些
深入理解計算機系統(第三版) 練習2.15
練習題 2.15 只使用位級和邏輯運算,編寫一個C表示式,他等價於x==y。換句話說,當x和y相等時他將返回1,否則返回0 因為 x ^ y 只會在x == y時為0,所以我們可以利用這一性質得到這個
深入理解計算機系統筆記之第二章(一)
資訊的表示和處理(一) 大多數計算機使用8位的塊(也就是一個位元組byte),由此可以看到32位(4個位元組)系統和64位(8個位元組)系統的區別。32位系統在於cpu可以同時處理4個位元組(32位)的資料,那麼64位系統cpu可以同時處理8個位元組(64位)的資料。 一個