【发布时间】:2011-11-10 04:55:12
【问题描述】:
我有一个 Java 程序,它使用 OAuth 与服务器通信以检索 XML 数据。
它利用Signpost OAuth库与源连接,并使用标准的InputStream读取方式来访问返回的XML。
最近,我注意到检索信息所花费的时间很慢,测试表明某些请求可能需要 2000 毫秒到 10000 毫秒(如果重要的话,源服务器在欧洲,我是在澳大利亚)。
我在 OAuth 通信 (request.connect()) 之后添加了一个时间戳,在读取 InputStream 之后又添加了一个时间戳,这是输出:
Request #1: Communication: [6351ms] Data process: [403ms] Total: [6754ms]
Request #2: Communication: [1ms] Data process: [3121ms] Total: [3122ms]
Request #3: Communication: [1ms] Data process: [1297ms] Total: [1298ms]
Request #4: Communication: [0ms] Data process: [539ms] Total: [539ms]
- 请求#4 实际上是请求#2 正在第二次运行。所有请求都在程序的一次运行中发出(没有停止和启动)。
我的问题: 是 InputStream 作为 HttpURLConnection 对象的一部分返回到 connect() 方法,还是在我从中读取时返回(顾名思义)以及实际连接过程的一部分?
第二个问题:根据上面的时间,慢的时间最有可能是服务器问题还是我读取 InputStream 的方法有问题?
供参考,这里是有问题的代码:
long startTime = System.currentTimeMillis();
URL url = new URL(urlString);
HttpURLConnection request = (HttpURLConnection) url.openConnection();
consumer.sign(request);
request.connect();
long connectionTime = System.currentTimeMillis();
InputStream is = request.getInputStream();
if (is != null) {
final BufferedReader bufferedreader = new BufferedReader(
new InputStreamReader(is, "UTF-8"));
final StringBuffer s2 = new StringBuffer();
String line;
line = bufferedreader.readLine();
if (line != null) {
s2.append(line);
while ((line = bufferedreader.readLine()) != null) {
s2.append('\n');
s2.append(line);
}
}
bufferedreader.close();
rv = s2.toString();
}
long finishTime = System.currentTimeMillis();
long timeTaken = finishTime - startTime;
long totalConnectionTime = connectionTime - startTime;
long processDataTime = finishTime - connectionTime;
String info = "Communication: [" + totalConnectionTime +
"ms] Data process: [" + processDataTime +
"ms] Total: [" + timeTaken + "ms]";
提前致谢。
【问题讨论】:
-
您是否尝试过计算独立于您的应用程序需要多长时间才能获得响应?例如(在 *nix 中)
wget,或者大约在浏览器中? -
您可以通过分析器运行您的代码来消除所有猜测。它很可能会告诉您瓶颈是在您的代码中还是在网络中
标签: java performance inputstream httpurlconnection