如何提高这种双重印刷的性能?

时间:2012-06-18 21:13:38

标签: java performance list optimization

我有以下静态方法打印从40.000行.xls电子表格导入的数据。

现在,在控制台中打印数据大约需要27秒,内存消耗量很大。

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;

public static void printSheetData(List<List<HSSFCell>> sheetData) {
    for (int i = 0; i < sheetData.size(); i++) {
        List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            System.out.print(cell.toString());
            if (j < list.size() - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("");
    }
}

免责声明:我知道,我知道大数据属于数据库,不在控制台中打印输出,过早优化是所有邪恶的根源......

2 个答案:

答案 0 :(得分:2)

您是否尝试使用StringBuilder创建大型字符串,然后一次性打印,或者在添加了这么多行之后,而不是一次打印出每一行?您将使用StringBuilder作为一种缓冲区。

如,

public static void printSheetData(List<List<HSSFCell>> sheetData) {
    StringBuilder strBuilder = new StringBuilder();
    for (int i = 0; i < sheetData.size(); i++) {
        List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            // System.out.print(cell.toString());
            strBuilder.append(cell.toString());
            if (j < list.size() - 1) {
                // System.out.print(", ");
                strBuilder.append(", ");
            }
        }
        // System.out.println("");
        strBuilder.append("\n");

        // consider testing strBuilder size here and printing it out if
        // it is greater than some pre-set, then re-initializing the 
        // strBuilder variable.
    }
    System.out.println(strBuilder.toString());
}

答案 1 :(得分:0)

尝试log4j。它会为你缓冲。 此外,不是将整个电子表格加载到内存中,而是可以在阅读时进行打印吗?