Synchronized로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

Synchronized로 검색한 결과
등록일:2008-04-14 11:07:41
작성자:
제목:자바 퍼포먼스 높이기...마지막


게시글  시간:  2002/09/17  11:36:00  오전
양인상  
새로운  답글  달기    새로운  답글  달기

마지막  입니다.

▶  클래스  집약
예제1)
public  class  Person{
private  Name  name;
private  Address  address;
}
class  Name{
private  String  firstName;
private  String  lastName;
private  String[]  otherNames;
}
class  Address{
private  int  houseNumber;
private  String  houseName;
private  String  streetName;
private  String  town;
private  String  area;
private  String  greaterArea;
private  String  country;
private  String  postCode;
}

예  제1)에서  정의된  Person  클래스는  Name형의  name과  Address형의  address,  두  개의  인스턴스  변수를  가진다.  클래스를  설계할  때  가능한  클래스의  수를  줄여서  수행  시  동적으로  생성되는  Object의  수를  줄일  수도  있다.  예제1)에서  정의된  세  개의  클래스는  하나의  클래스로  집약될  수  있다.

예제2)
public  class  Person{
private  String  firstName;
private  String  lastName;
private  String[]  otherNames;
private  int  houseNumber;
private  String  houseName;
private  String  streetName;
private  String  town;
private  String  area;
private  String  greaterArea;
private  String  country;
private  String  postCode;
}


▶  I/O  퍼포먼스  개선
자  바에서는  자료를  읽거나  쓰기  위해  stream을  사용한다.  자바는  두가지  형태의  stream을  지원한다.  Readers  and  Writers와  Input  and  Output  stream이  그것이다.  Reader  and  Writers는  high-level의  I/O(예.  String)를  지원하고  Input  and  Output  stream은  low-level의  I/O(byte)를  지원한다.  속도  향상을  위해서는  Buffered  stream을  사용한다.  Buffered  stream을  사용할  경우  버퍼의  기본값은  2K이다.  이  값은  조정될  수  있으나,  자료의  용량이  클  경우  메모리가  많이  필요하기  때문에  Buffered  stream을  사용할  경우  여러  가지  사항을  고려해야  한다.

예제1)  Simple  file  copy
public  static  void  copy(String  from,  String  to)  throws  IOException{
InputStream  in=null;
OutputStream  out=null;
try{
in=new  FileInputStream(from);
out=new  FileOutputStream(to);
while(true){
int  data=in.read();
if(data==-1)
break;
out.write(data);
}
in.close();
out.close();
}finally{
if(in!=null){in.close();}
if(out!=null){out.close();}
}
}

Buffered  stream을  사용하지  않고  I/O를  했을  경우의  예제이다.  370K의  JPEG  파일을  복사하는데  10800ms.

예제2)  Faster  file  copy
public  static  void  copy(String  from,  String  to)  throws  IOException{
InputStream  in=null;
OutputStream  out=null;
try{
in=new  BufferedInputStream(new  FileInputStream(from));
out=new  BufferedOutputStream(new  FileOutputStream(to));
while(true){
int  data=in.read();
if(data==-1)
break;
out.write(data);
}
}finally{
if(in!=null){in.close();}
if(out!=null){out.close();}
}
}

Bufferd  stream을  사용해서  퍼포먼스를  개선한  예제이다.  예제1)과  같은  파일을  복사하는데  130ms.

예제3)  Custom  buffered  copy
public  static  void  copy(String  from,  String  to)  throws  IOException{
InputStream  in=null;
OutputStream  out=null;
try{
in=new  FileInputStream(from);
out=new  FileOutputStream(to);
int  length=in.available();
byte[]  bytes=new  byte[length];
in.read(bytes);
out.write(bytes);
}finally{
if(in!=null){in.close();}
if(out!=null){out.close();}
}
}

while  루프를  사용하지  않고  배열을  사용함으로서  퍼포먼스를  개선한  예제이다.  예제1)과  같은  파일을  복사하는데  33ms.  하지만  예제3)은  byte배열로  선언되는  메모리  버퍼의  크기가  실제  파일의  크기와  동일해야  한다.  이에  따라  두  가지의  문제점이  발생할  수  있다.  첫  번째는  파일의  용량이  클  경우  상당한  메모리  낭비를  초래한다는  점이다.  두  번째  문제점은  copy()메소드가  수행될  때마다  new  byte[]에  의해  버퍼가  새로  만들어진다는  점이다.  만일  파일의  용량이  클  경우  버퍼가  만들어지고  Garbage  Collector에  의해  수집될  때  상당한  OverHead를  초래할  수  있다.

예제4)  Improved  custom  buffered  copy
static  final  int  BUFF_SIZE=100000;
static  fianl  byte[]  buffer=new  byte[BUFF_SIZE];
public  static  void  copy(String  from,  String  to)  throws  IOException{
InputStream  in=null;
OutputStream  out=null;
try{
in=new  FileInputStream(from);
out=new  FileOutputStream(to);
while(true){
Synchronized(buffer){
int  amountRead=in.read(buffer);
if(amountRead==-1)
break;
out.write(buffer,0,amountRead);
}
}finally{
if(in!=null){in.close();}
if(out!=null){out.close();}
}
}

크  기가  100K인  byte  배열을  임시버퍼로  지정하고,  이를  static으로  선언함으로서  퍼포먼스를  개선했다.  예제1)과  같은  파일을  복사하는데  22ms.  static  buffer의  사용으로  I/O작업을  수행할  경우  발생할  수  있는  문제점을  해결하기  위해  Synchronized  block을  사용했다.  비록  synchronization을  사용함에  따라  성능  저하를  초래하지만,  실제  while  루프에  머무는  시간이  극히  짧기  때문에  퍼포먼스에  문제는  없다.  테스트에  의하면  Synchronized  버전과  unSynchronized  버전  모두  같은  시간에  수행을  완료했다.


▶  웹  환경에서  Caching을  이용한  자바  퍼포먼스  개선
웹  환경에서  Object  caching  기법은  주로  DB나  파일에서  동일한  내용을  가져오는  루틴에서  사용된다.  DBMS에  sql문을  던지고  결과를  받아오는  부분의  내용이  거의  변동이  없을  경우  요청  시마다  매번  sql문을  실행시켜서  결과를  받아오는  것이  아니라  최초  실행된  값을  그대로  반환하는  기법이다.  그리고  시간  Check  기법을  이용해서  특정  시간  경과  후  요청이  들어오면  이전  요청에  의해  수행되어진  값을  갱신해서  반환한다.  결과에  의한  반환값이  메모리에  부담이  되지  않을  정도로  크지  않은  경우,  실시간으로  변경된  정보를  반환값으로  사용하는  루틴이  아닐  경우  유용하게  사용될  수  있다.



▶  Performance  CheckList
.  임시로  사용하기  위해  Object를  생성하는  것을  피하라.  특히  Loop에서..
.  빈번하게  호출되는  메소드에서  Object를  생성하는  것을  피하라.
.  가능한  Object를  재사용  하라.
.  임시  Object의  생성을  줄이기  위해  데이타  타입  컨버전  메소드를  재정의  하는  방법을  고  려하라.
.  메소드  설계  시  데이타를  유지하고  있는  Object를  반환하는  메소드보다  데이타로  채워진  재사용  가능한  Object에  접근하는  메소드를  정의하라.
.  string이나  Object를  integer  로  대치하라.  Object  비교를  위해  equal()  메소드를  호출하지  말고  기본  데이타  타입의  ==  연산자를  사용하라.
.  인스턴스  변수로  기본  데이타  타입을  사용하라.
.  단지  메소드  호출을  위해  Object를  생성하는  것을  피하라.
.  String  연속  연산자  (+)를  사용하는  것보다  StringBuffer  클래스를  사용하라.
.  복사본을  생성하는  메소드  보다  Object를  직접  수정하는  메소드를  사용하라.
.  생성자는  간단하게...  상속  계층은  얕게...
.  인스턴스  변수를  초기화  하는  것은  한  번  이상  하지  말  것.
.  생성자  호출을  피하기  위해  clone()  메소들  사용할  것.
.  간단한  배열일  경우에는  초기화를..  복잡한  배열일  경우에는  clone()  메소드  호출.
.  프로그램  내부에서  Object  생성  시기를  조절해서  Object  생성에  따른  bottlenecks를  없앤  다.
.  어플리케이션  내부에서  여분의  시간이  허용된다면  가능한  Object를  빨리  생성하라.  생성  된  Object를  내부적으로  유지하고  있다가  요청이  발생하면  할당하라.
.  사용  가능성이  희박하거나,  분산처리에  의해  Object를  생성할  경우  Object는  생성  시기를  늦춰라.

출처  :  http://www.ibm.com//developerworks/kr/forums/dw_thread.jsp?forum=7&thread=579&cat=4