多次创建后,BufferedReader变慢

时间:2017-08-22 21:45:03

标签: java bufferedreader

我有以下代码:我尝试做的是从for skill_list in df_skills["Skills"]: if "skill1" in skill_list: df_skills["skill1"] = 1 else: df_skills["skill1"] = 0 print(df_skills) df_skills = name Skill1 0 Joe 0 1 Sue 0 2 Chris 0 3 Sandy 0 4 Julia 0 读取几次(17.000次)。我基本上想要根据url.openConnection给出的单词从网站中搜索和提取代码。然而,在创建ArrayList大约40次后,它真的很慢。有更好的方法吗?

BufferedReader

3 个答案:

答案 0 :(得分:1)

由于以上原因,上述代码正在经历O(N ^ 2)减速:

frase = frase + word;

每次执行时,它都会重新分配内存并将更长和更长的字符串复制到内存缓冲区中。

最好使用StringBuilder

StringBuilder sb = new StringBuilder();

for(int i=0;i<words.size();i++) {
    key = (String)words.get(i);
    url = new URL("http://www.tvs.com/x/" + key);
    try ( InputStream is = url.openStream();
            InputStreamReader in = new InputStreamReader(is);
            BufferedReader reader = new BufferedReader(in)) {
        String word;
        while( (word = reader.readLine()) != null) {
            sb.append(word);
        }
    }
}

frase = sb.toString();

同时显示:尝试使用资源以确保始终正确关闭InputStreamInputStreamReaderBufferedReader,即使出现例外情况。

答案 1 :(得分:1)

使用StringBuffer的建议可能就是您想要的,但如果您使用的是Java 8,则可以使用BufferedReader.lines()方法和收集器来连接所需的字符串:

  URL url = new URL("http://www.tvs.com/x/" + key);
  try (InputStream is = url.openStream();
       InputStreamReader in = new InputStreamReader(is, StandardCharsets.UTF_8);
       BufferedReader reader = new BufferedReader(in)) {
    String phrase = reader.lines().collect(Collectors.joining(System.lineSeparator()));
  }

答案 2 :(得分:0)

  1. 瓶颈几乎肯定是字符串连接。使用StringBufferStringBuilder
  2. 也许发送主机会变慢。 BufferedReader无法读取数据的速度。您可能正在超载服务器。