gpt4 book ai didi

java - 为什么 Java HTTP 请求这么慢(与 Python 相比),我怎样才能使它们更快?

转载 作者:行者123 更新时间:2023-12-04 00:49:44 25 4
gpt4 key购买 nike

Java 是一门美丽的语言,据说也非常高效。在使用 Python 的背景下,我想看看这两种语言之间的区别——从一开始我就对 Java 基于 OOP 的语法的明确性和清晰性印象深刻。但是,我也想测试这些语言之间的性能差异。

我首先尝试通过计算速度测试两种语言之间的性能差异。为此,我用每种语言编写了一些代码——该程序试图计算一个数学问题,并且会迭代很多次。我不会在这里添加这段代码,但我会说出结果——Python 几乎比 Java 慢 2 倍(按时间衡量)。有趣,但这是意料之中的。毕竟,我想尝试使用 Java 的全部原因是因为吹嘘计算速度的人太多了。

之后,我进行了第二次测试 - 与网站建立 HTTP 连接,以下载网页。对于这个测试,我编写了另一个测试程序,它与上一个测试执行相同的操作,除了不是计算数学方程式,而是使用 HTTP 库下载网页。

我最终用 Python 编写了以下脚本。它非常简单,它在下载网页时迭代 10 次,然后打印平均值。

from requests import get
from time import time

# Start the timer
start = time()

# Loop 10 times
for i in range(10):
# Execute GET request
get("https://httpbin.org/get")

# Stop the timer
stop = time()

# Calculate and print average
avg = (stop - start) / 10

print(avg)
# Prints 0.5385, on my system.

为了Java测试,我写了下面这段代码。它与之前的测试相同,但使用 Java 实现。

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;
import java.util.Objects;

public class Test {

public static String run(String url) throws IOException {
// Code taken from OKHTTP docs
// https://square.github.io/okhttp/
// https://raw.githubusercontent.com/square/okhttp/master/samples/guide/src/main/java/okhttp3/guide/GetExample.java
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
.url(url)
.build();

try (Response response = client.newCall(request).execute()) {
return Objects.requireNonNull(response.body()).string();
}
}

public static void main(String[] args) throws IOException {
// Start the timer
long startTime = System.nanoTime();

// Loop 10 times
for (int i = 0; i < 10; i++) {
// Execute GET request
run("https://httpbin.org/get");
}

// Stop the timer
long endTime = System.nanoTime();

// Calculate the average
float average = (((float) (endTime - startTime)) / 1000000000) / 10;

// Print results (1.05035 on my system)
System.out.println(average);
}
}

嗯……没想到。唉,难道 Java 不应该比 Python 快吗?我很震惊地看到 Java 在这个测试中比 Python 慢了将近 2 倍,但我决心找到一个有利于 Java 的结论。为了满足这一点,我决定使用 Java 默认库而不是 OkHttp 库重新编写测试。我不会在这里显示代码,因为它很长,但我使用 HttpURLConnection 来帮助我。我的结果仍然相同,但比使用 OkHttp 库要快一些。

我的最终测试是与之前的测试相同,但在 http:// 网站上(以防由于 SSL 连接而导致速度缓慢)。我的结果还是一样——Python 快了将近 2 倍。我唯一能想到的是为什么会发生这种情况,因为 requests Python 库将用 C 编码,但正如您从 their GitHub page 的“语言”部分中看到的那样, 所有 requests 库都是用纯 Python 编写的。

我想了解为什么 Java 在运行 HTTP 连接时如此缓慢,如果我的系统设置或 Java 测试代码有问题,我应该编写什么来改进结果?此外,如果可能的话,如何发送 Java HTTP 请求才能使其比对应的 Python requests 请求更快?

最佳答案

我真的对你得到的结果持怀疑态度,所以我用与你的完全相同的 Python 代码和 main Java 方法(使用 https)试了一下。
这是读取响应的整个 JSON 内容的 Java run 方法:

private static String run(String url) throws IOException {
final URLConnection c = new URL(url).openConnection();
c.connect();
try (InputStream is = c.getInputStream()) {
final byte[] buf = new byte[1024];
final StringBuilder b = new StringBuilder();
int read = 0;
while ((read = is.read(buf)) != -1) {
b.append(new String(buf, 0, read));
}
return b.toString();
}
}

我系统上的结果:

  • Python 2.7.12:0.5117351770401001
  • Python 3.5.2:0.48344600200653076
  • Java 1.8:0.19684727

10 次迭代可能不足以获得好的结果,但在这里,Java 至少快 2 倍。

关于java - 为什么 Java HTTP 请求这么慢(与 Python 相比),我怎样才能使它们更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67420677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com