最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java性能優(yōu)化之?dāng)?shù)據(jù)結(jié)構(gòu)實(shí)例代碼

 更新時(shí)間:2018年01月03日 11:52:25   作者:Leesire  
這篇文章主要介紹了Java性能優(yōu)化之?dāng)?shù)據(jù)結(jié)構(gòu)實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下

—舉例(學(xué)生排課)—

正常思路的處理方法和優(yōu)化過(guò)后的處理方法:

比如說(shuō)給學(xué)生排課。學(xué)生和課程是一個(gè)多對(duì)多的關(guān)系。

按照正常的邏輯 應(yīng)該有一個(gè)關(guān)聯(lián)表來(lái)維護(hù) 兩者之間的關(guān)系。

現(xiàn)在,添加一個(gè)約束條件用于校驗(yàn)。如:張三上學(xué)期學(xué)過(guò)的課程,在排課的時(shí)候不應(yīng)該再排這種課程。

所以需要出現(xiàn)一個(gè)約束表(即:歷史成績(jī)表)。

即:學(xué)生選課表,需要學(xué)生成績(jī)表作為約束。

—方案一:正常處理方式—

當(dāng)一個(gè)學(xué)生進(jìn)行再次選課的時(shí)候。需要查詢學(xué)生選課表看是否已經(jīng)存在。

即有如下校驗(yàn):

//查詢 學(xué)生code和課程code分別為 A 和 B的數(shù)據(jù)是否存在 
 
//list集合中存放 學(xué)生選課記錄全部的數(shù)據(jù) 
List<StudentRecordEntity> ListStudentRecord=service.findAll();   
//查詢數(shù)據(jù),看是否已經(jīng)存在 
StudentRecordEntity enSr=ListStudentRecord.find(s=>s.學(xué)生Code==A && s.課程Code==B); 
If(enSr==null){ 
  //學(xué)生沒(méi)有選該課程 
  //.... 
}else{ 
  //學(xué)生已經(jīng)選過(guò)該課程 
  //.... 
} 

對(duì)于上面這種代碼的寫(xiě)法,非常的簡(jiǎn)練。而且也非常易懂。

首先,假設(shè)有5000個(gè)學(xué)生,100門(mén)課程。那么對(duì)于學(xué)生選課的數(shù)據(jù)集中,數(shù)據(jù)量將是5000*100.數(shù)據(jù)量會(huì)是十萬(wàn)級(jí)別的數(shù)量級(jí)。

在十萬(wàn)條數(shù)據(jù)中,查詢學(xué)生=A課程=B的一條記錄。執(zhí)行的效率會(huì)很低。因?yàn)閒ind方法的查詢也就是where查詢,即通過(guò)遍歷數(shù)據(jù)集合來(lái)查找。

所以,使用上面的代碼。在數(shù)據(jù)量逐漸增長(zhǎng)的過(guò)程中,程序的執(zhí)行效率會(huì)大幅度下降。

ps:數(shù)據(jù)量增長(zhǎng),在該例子中并不太適合。例子可能不太恰當(dāng)。總之,大概就是這個(gè)意思。)

—方案二:使用內(nèi)存進(jìn)行優(yōu)化效率—

這種做法,需要消耗內(nèi)存?;蛘哒f(shuō)把校驗(yàn)的工作向前做(數(shù)據(jù)的初始化,在部署系統(tǒng)的過(guò)程中進(jìn)行)。即:在頁(yè)面加載的時(shí)候數(shù)據(jù)只調(diào)用提供的public方法進(jìn)行校驗(yàn)。

//學(xué)生Code 到  數(shù)組索引 
Private Dictionary<string,int> _DicStudentCodeToArrayIndex;
//課程Code 到  數(shù)據(jù)索引 
Private Dictionary<string,int> _DicCourseCodeToArrayIndex;
//所有學(xué)生 
List<StudentEntity> ListStudent=service.findAllStudent();
//所有課程 
List<CourseEntity> ListCourse=service.findAllCourse();
//所有 學(xué)生選課記錄 
List<StudentCourseEntity> ListStudentRecord=service.finAll();
Private int[,] _ConnStudentRecord=new int[ListStudent.count,ListCourse.count];
//構(gòu)造 學(xué)生、課程的 數(shù)組 用于快速查找字典索引 
Private void GenerateDic(){
	For(int i=0;
	i<ListStudent.Count;
	i++) 
	    _DicStudentCodeToArrayIndex.Add(ListStudent[i].code,i)
}
For(int i=0;
i<ListCourse.Count;
i++){
	_DicCourseCodeToArrayIndex.Add(ListCourse[i].code,i)
}
}
//構(gòu)造學(xué)生選課 匹配的 二維數(shù)組。 1表示 學(xué)生已選該課程 
Private void GenerateArray(){
Foreach(StudentRecordEntity sre in ListStudentRecord){
	int x=_DicStudentCodeToArrayIndex[sre.學(xué)生Code];
	int y=DicCourseCodeToArrayIndex[sre.課程Code];
	ConnStudentRecord[x,y]=1;
}
}
//對(duì)外公開(kāi)的方法:根據(jù)學(xué)生Code 和課程Code 查詢 選課記錄是否存在 
/// <returns>返回1 表示存在。返回0表示不存在</returns> 
Public void VerifyRecordByStudentCodeAndCourseCode(String pStudentCode,String pCourseCode){
int x=_DicStudentCodeToArrayIndex[pStudentCode];
int y=_DicCourseCodeToArrayIndex[pCourseCode];
Return ConnStudentRecord[x,y];
}

—性能分析—

分析一下第二種方案的表象。

1、方法很多。

2、使用的變量很多。

首先要說(shuō)一下。該優(yōu)化的目的,是提高學(xué)生在選課的時(shí)候,所出現(xiàn)的卡頓現(xiàn)象(校驗(yàn)數(shù)據(jù)量大)。

分別對(duì)以上兩種方案進(jìn)行分析:

假設(shè)學(xué)生為N,課程為M

第一種方案:

時(shí)間復(fù)雜度很容易計(jì)算第一種方案最小為O(NM)

第二種方案:

1、代碼多。但是給用戶提供的只有一個(gè)VerifyRecordByStudentCodeAndCourseCode方法。

2、變量多,因?yàn)樵摲桨妇褪且褂脙?nèi)存提高效率的。

這個(gè)方法執(zhí)行流程:1、在Dictionary中使用Code找Index2、使用Index查詢數(shù)組。

第一步中,Dictionary中查詢是使用的Hash查找算法。時(shí)間復(fù)雜度為O(lgN)時(shí)間比較快。第二步,時(shí)間復(fù)雜度為O(1),因?yàn)閿?shù)組是連續(xù)的使用索引會(huì)直接查找對(duì)應(yīng)的地址。

所以,使用第二種方案進(jìn)行校驗(yàn),第二種方案時(shí)間復(fù)雜度為O(lgN+lgM)

—總結(jié)—

通過(guò)上面的分析,可以看出,內(nèi)存的付出是可以提高程序的執(zhí)行效率的。以上只是一個(gè)例子,優(yōu)化的好壞取決于使用的數(shù)據(jù)結(jié)構(gòu)。

以上就是本文關(guān)于Java性能優(yōu)化之?dāng)?shù)據(jù)結(jié)構(gòu)實(shí)例代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • Java current并發(fā)包超詳細(xì)分析

    Java current并發(fā)包超詳細(xì)分析

    current并發(fā)包、在JDK1.5之前Java并沒(méi)有提供線程安全的一些工具類(lèi)去操作多線程,需要開(kāi)發(fā)人員自行編寫(xiě)實(shí)現(xiàn)線程安全,但仍然無(wú)法完全避免低性能、死鎖、資源管理等問(wèn)題。在JDK1.5時(shí)新增了java.util.current并發(fā)包,其中提供了許多供我們使用的并發(fā)編程工具類(lèi)
    2023-02-02
  • SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫(kù)的配置方法

    SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫(kù)的配置方法

    這篇文章主要介紹了SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫(kù)的配置方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • Spring MVC攔截器(Interceptor)的定義和配置過(guò)程

    Spring MVC攔截器(Interceptor)的定義和配置過(guò)程

    這篇文章主要介紹了Spring MVC攔截器(Interceptor)的定義和配置過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 在Mybatis中association標(biāo)簽多層嵌套的問(wèn)題

    在Mybatis中association標(biāo)簽多層嵌套的問(wèn)題

    這篇文章主要介紹了在Mybatis中association標(biāo)簽多層嵌套的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 你會(huì)用Java代碼模擬高并發(fā)嗎

    你會(huì)用Java代碼模擬高并發(fā)嗎

    這篇文章主要介紹了你會(huì)用Java代碼模擬高并發(fā)嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Java利用多線程和分塊實(shí)現(xiàn)快速讀取文件

    Java利用多線程和分塊實(shí)現(xiàn)快速讀取文件

    在工作中經(jīng)常會(huì)有接收文件并且讀取落庫(kù)的需求,讀取方式都是串行讀取,所以本文主要為大家介紹一下如何利用多線程和分塊實(shí)現(xiàn)快速讀取文件,希望對(duì)大家有所幫助
    2023-09-09
  • Spring mvc服務(wù)端數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)流程詳解

    Spring mvc服務(wù)端數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了Spring mvc服務(wù)端數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java語(yǔ)言中的文件數(shù)據(jù)流示例詳解

    Java語(yǔ)言中的文件數(shù)據(jù)流示例詳解

    這篇文章主要為大家介紹了Java語(yǔ)言中的文件數(shù)據(jù)流示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 微服務(wù)之間如何通過(guò)feign調(diào)用接口上傳文件

    微服務(wù)之間如何通過(guò)feign調(diào)用接口上傳文件

    這篇文章主要介紹了微服務(wù)之間如何通過(guò)feign調(diào)用接口上傳文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot解決同名類(lèi)導(dǎo)致的bean名沖突bean name conflicts問(wèn)題

    SpringBoot解決同名類(lèi)導(dǎo)致的bean名沖突bean name conflicts問(wèn)題

    這篇文章主要介紹了SpringBoot解決同名類(lèi)導(dǎo)致的bean名沖突bean name conflicts問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

繁峙县| 新巴尔虎左旗| 盖州市| 且末县| 灵寿县| 通许县| 万年县| 彭泽县| 濉溪县| 靖江市| 河津市| 花莲县| 子长县| 剑川县| 沅陵县| 封开县| 洛宁县| 曲沃县| 喀什市| 宁远县| 泗洪县| 凤山市| 丹棱县| 黄山市| 孟连| 聂拉木县| 尉犁县| 化州市| 张北县| 普格县| 二连浩特市| 昌乐县| 怀仁县| 花垣县| 曲周县| 宁化县| 邢台市| 南安市| 桂林市| 云林县| 怀安县|