<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    IT神童

    java,net,php技術(shù)研究神童

    2012年8月23日

    讓Java代碼跑得更快

    本文簡(jiǎn)單介紹一下在寫代碼過(guò)程中用到的一些讓JAVA代碼更高效的技巧。

    1,將一些系統(tǒng)資源放在池中,如數(shù)據(jù)庫(kù)連接,線程等.在standalone的應(yīng)用中,數(shù)據(jù)庫(kù)連接池可以使用一些開源的連接池實(shí)現(xiàn),如C3P0,proxool和DBCP等,在運(yùn)行在容器中的應(yīng)用這可以使用服務(wù)器提供的DataSource.線程池可以使用JDK本身就提供的java.util.concurrent.ExecutorService.

    1. import java.util.concurrent.Executors;  
    2. import java.util.concurrent.ExecutorService;  
    3. public class JavaThreadPool {  
    4.     public static void main(String[] args) {  
    5.     ExecutorService pool = Executors.newFixedThreadPool(2);  
    6.       
    7.     Thread t1 = new MyThread();  
    8.     Thread t2 = new MyThread();  
    9.     Thread t3 = new MyThread();  
    10.     Thread t4 = new MyThread();  
    11.     Thread t5 = new MyThread();  
    12.  
    13.     pool.execute(t1);  
    14.     pool.execute(t2);  
    15.     pool.execute(t3);  
    16.     pool.execute(t4);  
    17.  
    18.     pool.shutdown();  
    19.     }  
    20. }  
    21.  
    22. class MyThread extends Thread {  
    23.     public void run() {  
    24.     System.out.println(Thread.currentThread().getName() + "running....");  
    25.     }  
    26. }  

    2,減少網(wǎng)絡(luò)開銷,在和數(shù)據(jù)庫(kù)或者遠(yuǎn)程服務(wù)交互的時(shí)候,盡量將多次調(diào)用合并到一次調(diào)用中。

    3,將經(jīng)常訪問(wèn)的外部資源cache到內(nèi)存中,簡(jiǎn)單的可以使用static的hashmap在應(yīng)用啟動(dòng)的時(shí)候加載,也可以使用一些開源的cache框架,如OSCache和Ehcache等.和資源的同步可以考慮定期輪詢和外部資源更新時(shí)候主動(dòng)通知.或者在自己寫的代碼中留出接口(命令方式或者界面方式)共手動(dòng)同步。

    4,優(yōu)化IO操作,JAVA操作文件的時(shí)候分InputStream and OutputStream,Reader and Writer兩類,stream的方式要快,后者主要是為了操作字符而用的,在字符僅僅是ASCII的時(shí)候可以用stream的方式提高效率.JDK1.4之后的nio比io的效率更好。java教程下載

    1. OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("d:/temp/test.txt")));              
    2. out.write("abcde".getBytes());        
    3. out.flush();  
    4. out.close(); 

    利用BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter減少對(duì)磁盤的直接訪問(wèn)次數(shù)。

    1. FileReader fr = new FileReader(f);  
    2. BufferedReader br = new BufferedReader(fr);  
    3. while (br.readLine() != null) count++; 

    5不要頻繁的new對(duì)象,對(duì)于在整個(gè)應(yīng)用中只需要存在一個(gè)實(shí)例的類使用單例模式.對(duì)于String的連接操作,使用StringBuffer或者StringBuilder.對(duì)于utility類型的類通過(guò)靜態(tài)方法來(lái)訪問(wèn)。

    6,避免使用錯(cuò)誤的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用instanceof做條件判斷,盡量使用比的條件判斷方式.使用JAVA中效率高的類,比如ArrayList比Vector性能好。

    7,對(duì)性能的考慮要在系統(tǒng)分析和設(shè)計(jì)之初就要考慮。

    總之,一個(gè)系統(tǒng)運(yùn)行時(shí)的性能,無(wú)非是從CPU,Memory和IO這三個(gè)主要方面來(lái)考慮優(yōu)化.減少不必要的CPU消耗,減少不必要的IO操作,增加Memory利用效率。

    posted @ 2012-08-23 14:42 IT神童 閱讀(541) | 評(píng)論 (0)編輯 收藏

    Java高并發(fā):靜態(tài)頁(yè)面生成方案

    提升網(wǎng)站性能的方式有很多,例如有效的使用緩存,生成靜態(tài)頁(yè)面等等。今天要說(shuō)的就是生成靜態(tài)頁(yè)面的方式。這個(gè)也是我近期一直在搞的一個(gè)問(wèn)題,近期在做使用html + servlet做個(gè)人網(wǎng)站,為什么是這2個(gè)東西呢?

    1、直接用servlet是為了保證網(wǎng)站能以最快的速度執(zhí)行命令個(gè)人總感覺像Struts hibernate spring之類的雖然方便但是效能帶來(lái)的損耗不太能接收

    2、使用html同樣是為了保證最快的反應(yīng)速度,畢竟html 比jsp少了一層服務(wù)器執(zhí)行。速度上要快的多

    一、在這里要先說(shuō)一下什么是頁(yè)面靜態(tài)化:

    簡(jiǎn)單的說(shuō),我們?nèi)绻L問(wèn)一個(gè)鏈接 ,服務(wù)器對(duì)應(yīng)的模塊會(huì)處理這個(gè)請(qǐng)求,轉(zhuǎn)到對(duì)應(yīng)的jsp界面,最后生成我們想要看到的數(shù)據(jù)。這其中的缺點(diǎn)是顯而易見的:因?yàn)槊看握?qǐng)求服務(wù)器都會(huì)進(jìn)行處理,如果有太多的高并發(fā)請(qǐng)求,那么就會(huì)加重應(yīng)用服務(wù)器的壓力,弄不好就把服務(wù)器 搞down 掉了。那么如何去避免呢?如果我們把對(duì) test.do 請(qǐng)求后的結(jié)果保存成一個(gè) html 文件,然后每次用戶都去訪問(wèn) ,這樣應(yīng)用服務(wù)器的壓力不就減少了?

    那么靜態(tài)頁(yè)面從哪里來(lái)呢?總不能讓我們每個(gè)頁(yè)面都手動(dòng)處理吧?這里就牽涉到我們要講解的內(nèi)容了,靜態(tài)頁(yè)面生成方案… 我們需要的是自動(dòng)的生成靜態(tài)頁(yè)面,當(dāng)用戶訪問(wèn) ,會(huì)自動(dòng)生成 test.html ,然后顯示給用戶。

    二、下面我們?cè)诤?jiǎn)單介紹一下要想掌握頁(yè)面靜態(tài)化方案應(yīng)該掌握的知識(shí)點(diǎn)

    1、 基礎(chǔ)- URL Rewrite

    什么是 URL Rewrite 呢 ? URL 重寫。用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明問(wèn)題:輸入網(wǎng)址 ,但是實(shí)際上訪問(wèn)的卻是 abc.com/test.action,那我們就可以說(shuō) URL 被重寫了。這項(xiàng)技術(shù)應(yīng)用廣泛,有許多開源的工具可以實(shí)現(xiàn)這個(gè)功能。java電子書免費(fèi)下載2、 基礎(chǔ)- Servlet web.xml

    如果你還不知道 web.xml 中一個(gè)請(qǐng)求和一個(gè) servlet 是如何匹配到一起的,那么請(qǐng)搜索一下 servlet 的文檔。這可不是亂說(shuō)呀,有很多人就認(rèn)為 /xyz/*.do 這樣的匹配方式能有效。

    如果你還不知道怎么編寫一個(gè) servlet ,那么請(qǐng)搜索一下如何編寫 servlet.這可不是說(shuō)笑呀,在各種集成工具漫天飛舞的今天,很多人都不會(huì)去從零編寫一個(gè) servlet了。

    三、基本的方案介紹

    其中,對(duì)于 URL Rewriter的部分,可以使用收費(fèi)或者開源的工具來(lái)實(shí)現(xiàn),如果 url不是特別的復(fù)雜,可以考慮在 servlet 中實(shí)現(xiàn),那么就是下面這個(gè)樣子:
     

    posted @ 2012-08-23 14:41 IT神童 閱讀(147) | 評(píng)論 (0)編輯 收藏

    公司的Java框架應(yīng)具備的通用功能

    以前在學(xué)校的時(shí)候自己以為是不是每個(gè)做JAVA開發(fā)的公司每次做項(xiàng)目的時(shí)候都要搭建一個(gè)SSH框架呢,工作之后才發(fā)現(xiàn)每個(gè)公司都有自己的一套框架,要不是在SSH基礎(chǔ)上,要不是在SSI基礎(chǔ)上進(jìn)行了符合自己公司需求的封裝,并且隨著自己公司的框架被應(yīng)用到各個(gè)實(shí)際系統(tǒng)的過(guò)程中,這個(gè)框架會(huì)越來(lái)越成熟,會(huì)使該公司的開發(fā)效率越來(lái)越高。

    根據(jù)筆者接觸過(guò)的幾個(gè)公司的框架,筆者發(fā)現(xiàn)要想實(shí)現(xiàn)高效的開發(fā),每個(gè)公司的框架應(yīng)該具備如下的特點(diǎn):

    1.具有靈活的分頁(yè)功能。

    分頁(yè)功能是每個(gè)項(xiàng)目中必須要實(shí)現(xiàn)的功能,而恰恰這個(gè)功能是比較費(fèi)時(shí)費(fèi)力的,如果在框架中實(shí)現(xiàn)這一功能,將在每個(gè)項(xiàng)目中大大減少分頁(yè)的重復(fù)性工作。

    2.可以方便的實(shí)現(xiàn)文件的上傳與下載、數(shù)據(jù)的導(dǎo)入和導(dǎo)出的功能。

    文件的上傳于下載、數(shù)據(jù)的導(dǎo)入和導(dǎo)出在大部門項(xiàng)目中也會(huì)遇到,但是這兩個(gè)功能可能會(huì)因?yàn)轫?xiàng)目的不同導(dǎo)致實(shí)現(xiàn)上有一點(diǎn)區(qū)別,我們框架中要做的就是應(yīng)該抽出其中共有的東西,定義為抽象的東西,以便不同的項(xiàng)目、不同的需求都能很容易的實(shí)現(xiàn)該功能。成都java培訓(xùn)機(jī)構(gòu)
    3.方便的事務(wù)管理功能。

    事務(wù)管理一般來(lái)說(shuō)都定義在業(yè)務(wù)邏輯層。我們框架中應(yīng)該實(shí)現(xiàn)對(duì)業(yè)務(wù)邏輯對(duì)象事務(wù)的簡(jiǎn)單配置甚至是零配置。筆者接觸過(guò)的兩個(gè)框架中,一個(gè)需要在配置完一個(gè)業(yè)務(wù)邏輯對(duì)象時(shí),在事務(wù)管理的配置文件中加上一句簡(jiǎn)單的配置即可,另一個(gè)是框架中實(shí)現(xiàn)了幾個(gè)基本的業(yè)務(wù)邏輯對(duì)象,并對(duì)這幾個(gè)對(duì)象實(shí)現(xiàn)了事務(wù)管理的配置,開發(fā)的時(shí)候定義的業(yè)務(wù)邏輯對(duì)象都是繼承自這幾個(gè)基本對(duì)象,也就省去了事務(wù)管理的配置。

    4.具有異常處理框架。

    基本上每個(gè)項(xiàng)目的異常處理都應(yīng)該可以使用公司的框架定義的異常處理框架,并不會(huì)因?yàn)轫?xiàng)目的不同而要求的異常處理也不一樣。

    5.具有自己的一套頁(yè)面組件。

    項(xiàng)目開發(fā)都是團(tuán)隊(duì)的開發(fā),要想保證每個(gè)開發(fā)人員的界面風(fēng)格統(tǒng)一,最好的辦法就是定義一套公司自己的頁(yè)面組建。這樣既能保證開發(fā)效率,也能做到界面的統(tǒng)一。freemark就是不錯(cuò)的選擇,其支持自定義宏,公司框架中可以定義一套自己的頁(yè)面組建宏,供開發(fā)人員調(diào)用即可。


     

    6.具有數(shù)據(jù)校驗(yàn)框架。

    每個(gè)項(xiàng)目在數(shù)據(jù)校驗(yàn)時(shí)都可能會(huì)用到大量的正則表達(dá)式,那么在公司的框架中將這些正則表達(dá)式封裝起來(lái),提供統(tǒng)一的調(diào)用接口將是不錯(cuò)的選擇。

    7.簡(jiǎn)單的實(shí)現(xiàn)菜單的配置。

    一個(gè)好的框架應(yīng)該提供對(duì)菜單、二級(jí)菜單等的簡(jiǎn)單配置、管理。還是上文提到的兩個(gè)框架,一個(gè)是通過(guò)XML配置文件實(shí)現(xiàn)了對(duì)系統(tǒng)中一級(jí)菜單、二級(jí)菜單、三級(jí)菜單的管理,而另個(gè)框架要實(shí)現(xiàn)相同的需求卻要在數(shù)據(jù)庫(kù)中進(jìn)行繁瑣的配置,顯然第一個(gè)框架的實(shí)現(xiàn)方案更可取、更高效。

    posted @ 2012-08-23 14:40 IT神童 閱讀(270) | 評(píng)論 (1)編輯 收藏

    Java中用內(nèi)存映射處理大文件

    在處理大文件時(shí),如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 來(lái)進(jìn)行頻繁的讀寫操作,都將導(dǎo)致進(jìn)程因頻繁讀寫外存而降低速度.如下為一個(gè)對(duì)比實(shí)驗(yàn)。

    1. package test;  
    2.  
    3. import java.io.BufferedInputStream;  
    4. import java.io.FileInputStream;  
    5. import java.io.FileNotFoundException;  
    6. import java.io.IOException;  
    7. import java.io.RandomAccessFile;  
    8. import java.nio.MappedByteBuffer;  
    9. import java.nio.channels.FileChannel;  
    10.  
    11. public class Test {  
    12.  
    13.       
    14.     public static void main(String[] args) {  
    15.         try {  
    16.             FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");  
    17.             int sum=0;  
    18.             int n;  
    19.             long t1=System.currentTimeMillis();  
    20.             try {  
    21.                 while((n=fis.read())>=0){  
    22.                     sum+=n;  
    23.                 }  
    24.             } catch (IOException e) {  
    25.                 // TODO Auto-generated catch block  
    26.                 e.printStackTrace();  
    27.             }  
    28.             long t=System.currentTimeMillis()-t1;  
    29.             System.out.println("sum:"+sum+"  time:"+t);  
    30.         } catch (FileNotFoundException e) {  
    31.             // TODO Auto-generated catch block  
    32.             e.printStackTrace();  
    33.         }  
    34.           
    35.         try {  
    36.             FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");  
    37.             BufferedInputStream bis=new BufferedInputStream(fis);  
    38.             int sum=0;  
    39.             int n;  
    40.             long t1=System.currentTimeMillis();  
    41.             try {  
    42.                 while((n=bis.read())>=0){  
    43.                     sum+=n;  
    44.                 }  
    45.             } catch (IOException e) {  
    46.                 // TODO Auto-generated catch block  
    47.                 e.printStackTrace();  
    48.             }  
    49.             long t=System.currentTimeMillis()-t1;  
    50.             System.out.println("sum:"+sum+"  time:"+t);  
    51.         } catch (FileNotFoundException e) {  
    52.             // TODO Auto-generated catch block  
    53.             e.printStackTrace();  
    54.         }  
    55.           
    56.         MappedByteBuffer buffer=null;  
    57.         try {  
    58.             buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 01253244);  
    59.             int sum=0;  
    60.             int n;  
    61.             long t1=System.currentTimeMillis();  
    62.             for(int i=0;i<1253244;i++){  
    63.                 n=0x000000ff&buffer.get(i);  
    64.                 sum+=n;  
    65.             }  
    66.             long t=System.currentTimeMillis()-t1;  
    67.             System.out.println("sum:"+sum+"  time:"+t);  
    68.         } catch (FileNotFoundException e) {  
    69.             // TODO Auto-generated catch block  
    70.             e.printStackTrace();  
    71.         } catch (IOException e) {  
    72.             // TODO Auto-generated catch block  
    73.             e.printStackTrace();  
    74.         }  
    75.  
    76.     }  
    77.  
    78. }  
    java基礎(chǔ)教程
    測(cè)試文件為一個(gè)大小為1253244字節(jié)的文件。測(cè)試結(jié)果:
    1. sum:220152087 time:1464  
    2. sum:220152087 time:72  
    3. sum:220152087 time:25 

    說(shuō)明讀數(shù)據(jù)無(wú)誤。刪去其中的數(shù)據(jù)處理部分。

    1. package test;  
    2.  
    3. import java.io.BufferedInputStream;  
    4. import java.io.FileInputStream;  
    5. import java.io.FileNotFoundException;  
    6. import java.io.IOException;  
    7. import java.io.RandomAccessFile;  
    8. import java.nio.MappedByteBuffer;  
    9. import java.nio.channels.FileChannel;  
    10.  
    11. public class Test {  
    12.  
    13.       
    14.     public static void main(String[] args) {  
    15.         try {  
    16.             FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");  
    17.             int sum=0;  
    18.             int n;  
    19.             long t1=System.currentTimeMillis();  
    20.             try {  
    21.                 while((n=fis.read())>=0){  
    22.                     //sum+=n;  
    23.                 }  
    24.             } catch (IOException e) {  
    25.                 // TODO Auto-generated catch block  
    26.                 e.printStackTrace();  
    27.             }  
    28.             long t=System.currentTimeMillis()-t1;  
    29.             System.out.println("sum:"+sum+"  time:"+t);  
    30.         } catch (FileNotFoundException e) {  
    31.             // TODO Auto-generated catch block  
    32.             e.printStackTrace();  
    33.         }  
    34.           
    35.         try {  
    36.             FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");  
    37.             BufferedInputStream bis=new BufferedInputStream(fis);  
    38.             int sum=0;  
    39.             int n;  
    40.             long t1=System.currentTimeMillis();  
    41.             try {  
    42.                 while((n=bis.read())>=0){  
    43.                     //sum+=n;  
    44.                 }  
    45.             } catch (IOException e) {  
    46.                 // TODO Auto-generated catch block  
    47.                 e.printStackTrace();  
    48.             }  
    49.             long t=System.currentTimeMillis()-t1;  
    50.             System.out.println("sum:"+sum+"  time:"+t);  
    51.         } catch (FileNotFoundException e) {  
    52.             // TODO Auto-generated catch block  
    53.             e.printStackTrace();  
    54.         }  
    55.           
    56.         MappedByteBuffer buffer=null;  
    57.         try {  
    58.             buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 01253244);  
    59.             int sum=0;  
    60.             int n;  
    61.             long t1=System.currentTimeMillis();  
    62.             for(int i=0;i<1253244;i++){  
    63.                 //n=0x000000ff&buffer.get(i);  
    64.                 //sum+=n;  
    65.             }  
    66.             long t=System.currentTimeMillis()-t1;  
    67.             System.out.println("sum:"+sum+"  time:"+t);  
    68.         } catch (FileNotFoundException e) {  
    69.             // TODO Auto-generated catch block  
    70.             e.printStackTrace();  
    71.         } catch (IOException e) {  
    72.             // TODO Auto-generated catch block  
    73.             e.printStackTrace();  
    74.         }  
    75.  
    76.     }  
    77.  

    測(cè)試結(jié)果:

    1. sum:0 time:1458  
    2. sum:0 time:67  
    3. sum:0 time:8 

    由此可見,將文件部分或者全部映射到內(nèi)存后進(jìn)行讀寫,速度將提高很多。

    這是因?yàn)閮?nèi)存映射文件首先將外存上的文件映射到內(nèi)存中的一塊連續(xù)區(qū)域,被當(dāng)成一個(gè)字節(jié)數(shù)組進(jìn)行處理,讀寫操作直接對(duì)內(nèi)存進(jìn)行操作,而后再將內(nèi)存區(qū)域重新映射到外存文件,這就節(jié)省了中間頻繁的對(duì)外存進(jìn)行讀寫的時(shí)間,大大降低了讀寫時(shí)間。

    posted @ 2012-08-23 14:37 IT神童 閱讀(214) | 評(píng)論 (0)編輯 收藏

    <2012年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 最新亚洲成av人免费看| 久久久久久久久亚洲| h在线观看视频免费网站| 最近中文字幕电影大全免费版| 亚洲国产精品嫩草影院| 亚洲黑人嫩小videos| 国产亚洲精品免费视频播放| 日本卡1卡2卡三卡免费| 免费人成大片在线观看播放电影| 亚洲综合精品网站| 免费看a级黄色片| 成人免费的性色视频| 黄页网址在线免费观看| 久久久久亚洲国产| 亚洲国产电影在线观看| 亚洲第一成人影院| 国产黄色片在线免费观看| 野花高清在线电影观看免费视频 | 国产大片线上免费观看| 香蕉免费一区二区三区| 中文成人久久久久影院免费观看 | 大地资源二在线观看免费高清| 久久久久国产免费| 精品一区二区三区免费| 中文字幕av免费专区| 国产免费一级高清淫曰本片| 成人在线免费视频| caoporm碰最新免费公开视频| 免费国产a理论片| 成人午夜免费视频| eeuss免费天堂影院| 999zyz**站免费毛片| 国产一级高青免费| 秋霞人成在线观看免费视频 | 免费A级毛片无码久久版| 免费国产污网站在线观看| 国产高清对白在线观看免费91 | 国产高清免费的视频| 国产又黄又爽又刺激的免费网址| 午夜免费福利影院| 国产嫩草影院精品免费网址|