Java:如何改进代码以提高性能?

时间:2015-11-11 07:13:55

标签: java

我有一个程序从给定目录中读取.txt文件。每条记录行都包含一个数据,我正在解析它。我认为这对性能而言代价高昂,但我可能错了。这是方法。如何改进它以提高性能?

    currentLine = uploadFileReader.readLine();

    while (!isBlankOrNull(currentLine)) {                 
                line++;
                String[] record = parseRecord(currentLine);
         // process the record array here..
    }

    private String[] parseRecord(String currentLine){

        String[] recordLine = currentLine.split("\\|");
        String[] record = null;
        String[] zeroArray = null;          

        if(recordLine.length == 4){
            zeroArray = new String[] {"0","0","0","0","0","0"};
            record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);
        }else if(recordLine.length == 5){
            zeroArray = new String[] {"0","0","0","0","0"};
            record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);  
        }else if(recordLine.length == 6){
            zeroArray = new String[] {"0","0","0","0"};
            record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);  
        }else if(recordLine.length == 7){
            zeroArray = new String[] {"0","0","0"};
            record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);  
        }else if(recordLine.length == 8){
            zeroArray = new String[] {"0","0"};
            record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);  
        }else if(recordLine.length == 9){
            zeroArray = new String[] {"0"};
            record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);  
        }else{
            record = recordLine;
        }

        return record;
    }

示例文件内容:

    0000710000|07-23-2015|08-24-2015|257072140993|1|0.2|0.3|||

每个空/空白管道都有“0”默认值

2 个答案:

答案 0 :(得分:1)

我能想到的唯一解释是花费6分钟读取2000行文件:

  • 您使用的是无缓冲的阅读器。

  • 个别行很长。

  • 以上两点。

在任何一种情况下,识别性能瓶颈的好方法是使用分析器。

如果(假设)问题是由上述原因之一引起的,您可以通过(分别)改善阅读时间:

  1. 使用Reader

  2. 包裹BufferedReader
  3. 使用Scanner直接从阅读器阅读,而不是阅读整行和分割,

  4. 避免将整个文件内容保存在内存中。

  5. 我倾向于认为2.不会产生很大的不同,并且3.除非文件非常大,否则不会。

答案 1 :(得分:0)

您可以更简单地重写如下。要求似乎返回一个字符串数组始终长度为10,“0”填充任何未使用的单元格?

如果没有真正的测试数据,我无法评论它与原始数据的相对性能,但是它显然“更少”工作,更少的数组分配,条件检查等,因此“非常可能”更快......

private String[] parseRecord(String currentLine) {
    String[] recordLine = currentLine.split("\\|");
    String[] record = new String[10];
    for (int i = 0; i < record.length; i++) {
        if (i < recordLine.length) {
            record[i] = recordLine[i];
        } else {
            record[i] = "0";
        }
    }
    return record;
}

测试

public static void main(String[] args) {
    System.out.println(Arrays.toString(parseRecord("1")));
    System.out.println(Arrays.toString(parseRecord("1|2")));
    System.out.println(Arrays.toString(parseRecord("1|2|3|4|5|6|7|8|9")));
    System.out.println(Arrays.toString(parseRecord("1|2|3|4|5|6|7|8|9|10")));
}

输出

[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]