POI POI HSSF, XSSF, SXSSF 성능 분석

황제낙엽 2013.11.05 15:10 조회 수 : 1590

sitelink1 http://erictus.tistory.com/86 
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

성능 분석이라고는 썻지만 그정도는 아니고, 이번 업무로 기존 Jxl을 사용하던 방식에서 POI로 변환하는 부분인데, 겨우 9천건 ~ 3만건정도인데 너무 느리기에 이를 개선하는 업무였다.


따라서, 자연스럽게 엑셀 생성의 핵심인 Workbook에 대해 알아보자!!


Workbook의 종류로는 엑셀 97~2003버전인 HSSF , 엑셀 2007이상의 XSSF, 가장 최근에 나온 성능개선버전의 SXSSF...


POI_workbook별_성능.PNG





결론부터 말하자면, "고전만큼 좋은게 없다"




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public class test {
    private Sheet s;
    public static final int HSSF = 0;
    public static final int XSSF = 1;
    public static final int SXSSF = 2;
    private Workbook wb;
    public test(int type) {
        // TODO 자동 생성된 생성자 스텁
        switch(type){
            case HSSF : wb = new HSSFWorkbook();
                break;
            case XSSF : wb = new XSSFWorkbook();
                break;
            case SXSSF : wb = new SXSSFWorkbook(-1);
                break;
        }
    }
     
    public Row getRow(int i){
        Row r = s.getRow(i);
        if(r==null)
            r = s.createRow(i);
        return r;
    }
     
    public Cell getCell(int row,int cell){
        Row r = getRow(row);
        Cell c = r.getCell(cell);
        if(c==null)
            c = r.createCell(cell);
        return c;
    }
     
    public void setCellValue(int row, int cell, String cellvalue){
        Cell c = getCell(row,cell);
        c.setCellValue(cellvalue);
    }
     
    public void writeWorkbook(String fileName){
        long start = System.currentTimeMillis();
        try{
            s = wb.createSheet("sample Sheet");
            for(int i=0;i<10000;i++){
                setCellValue(i,0,"Test_Title_"+i);
                setCellValue(i,1,"Test_Title_"+i);
                setCellValue(i,2,"Test_Title_"+i);
                setCellValue(i,3,"Test_Title_"+i);
                setCellValue(i,4,"Test_Title_"+i);
                setCellValue(i,5,"Test_Title_"+i);
                setCellValue(i,6,"Test_Title_"+i);
                setCellValue(i,7,"Test_Title_"+i);
                setCellValue(i,8,"Test_Title_"+i);
                setCellValue(i,9,"Test_Title_"+i);
                setCellValue(i,10,"Test_Title_"+i);
            }
            wb.write(new FileOutputStream(fileName));
        }catch(Exception e){
            e.printStackTrace();
            System.err.println(e.getMessage());
        }
        long end = System.currentTimeMillis();
        System.out.println("writeHSSFWorkbook : "+(end-start));
    }
     
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 자동 생성된 메소드 스텁
        test hssf = new test(test.HSSF);
        hssf.writeWorkbook("hssf-sample.xls");
         
        test xssf = new test(test.XSSF);
        xssf.writeWorkbook("xssf-sample.xls");
         
        test sxssf = new test(test.SXSSF);
        sxssf.writeWorkbook("sxssf-sample.xls");
         
    }
 
}


못믿겠다면 결과를 보자..


POI벤치마크.PNG


대략 3만건의 데이터를 만드는 소요 시간을 계산해보았당..

보다 싶이 HSSF와 SXSSF의 경우 속도가 괜찮지만....XSSF........


선택은 본인들이...



ps. SXSSF를 사용하게 될 경우, 생각보다 많은 의존성이 필요하다...(최소 이정도의 xml관련 Lib가 필요하다..)

HSSF 쓸 경우, poi-3.9....jar만 있음됨.


 dom4j-1.6.1.jar


 poi-3.9-20121203.jar


 poi-ooxml-3.9-20121203.jar


 poi-ooxml-schemas-3.9-20121203.jar


 poi-scratchpad-3.9-20121203.jar


 xbean.jar


 xbean_xpath.jar


 xmlbeans-qname.jar


 xmlpublic.jar


 xstream-1.4.1.jar




그리고 한가지더!!

만약 jdk 1.5이하를 사용할 경우 jdk 1.6부터 추가된 "javax.xml.stream.*"관련 소스를 참조하기때문에 에러가 발생한다...

쫄지말자.. 까짓거 jdk1.6이상 소스에서 아래와 같은 파일만 추가하면된다...(물론 JDK1.6이상일 경우는 문제없다..)


javax.xml.gif