1. 程式人生 > >cs app深入理解計算機系統:第五章 優化程式效能 幾個優化的java實現

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位)的資料。 一個