我有一个用 python3.6
编写的程序,现在我想用 c++
重新编写它以使其更快。在此之前,我决定进行一个小测试,以推断我能获得多少速度。该程序发出大量 http 请求,因此我决定测试 http 请求速度。但我对结果感到非常惊讶,因为 python 在每个请求中比 c++ 更快,平均 ~50ms
(有时 ~100ms
有时 ~10ms
>) 我不明白为什么。
这是我的 C++ 代码:
#include "swish/swish.h"
#include <chrono>
int main() {
swish::Client httpclient = swish::Client();
std::chrono::milliseconds since = std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch());
std::pair<swish::Response<swish::ResponseHeaderBuffer>, swish::StatusCode> resp = httpclient.Get("https://api.btcturk.com/api/v2/ticker");
std::chrono::milliseconds now = std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch());
std::cout << now.count() - since.count() << std::endl;
return 0;
}
我正在使用这个 swish http client
库(这只是curl包装器。这是库 repo )来发出请求并使用命令 clang++ testcpp.cpp 编译它-std=c++17 -o test -lcurl -O3
。
这是我的 Python 代码:
import time
import requests
current_milli_time = lambda: int(round(time.time() * 1000))
if __name__ == "__main__":
since = current_milli_time()
res = requests.get('https://api.btcturk.com/api/v2/ticker')
now = current_milli_time()
print(now - since)
是因为大部分毫秒是因为等待响应所以它完全与网络相关吗?但 python 每次都更快。我以不同的间隔尝试了20~30次。或者是因为这个库的Python代码确实经过了优化??
最佳答案
差异可能是因为 Python 有一种非常优化的页面请求方式,而您使用的 swish
lib/code 却没有。
网络时间可能是相同的(事实上,它应该是相同的),但你真的无法知道(除非你开发了swish
lib)什么那个图书馆正在做。
在 c++
中请求网页可以通过多种方式完成,除非您为这两种方式编写代码,否则没有人可以比较。
我想说你的方法(调用 swish )不是最佳的(但在所有情况下都很有用),而 Python 是为最佳“请求和等待响应”而设计的。
所以在这种情况下,Python 的优势在于有成千上万的用户报告反馈,从而允许开发人员对其进行优化。
Swish 可能没有那么多用户,可能没有那么多反馈,而且它不像 Python 那样优化(毕竟它调用 c
。)
如果有人有疑问,有一些方法可以加快速度,例如 TCP_NODELAY这会有所作为。或者只是 select
调用中的超时。
当谈论网络时,语言不是瓶颈,而是网络。因此,如果您对库性能不满意,您应该更改库而不是语言。
关于python - 对于http请求,python比c++更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62278057/