C++HTTPS库在性能方面如何比较(例如内存占用、CPU时间等)

How do C++ HTTPS libraries compare in terms of performance (e.g. memory footprint, CPU time, etc?)

本文关键字:内存 时间等 CPU 比较 性能 方面如 何比较 C++HTTPS      更新时间:2023-10-16

我看到过几篇文章,说一个网络库由于功能或易用性而比另一个更好,但我没有看到任何与性能有关的内容。我查遍了谷歌,找不到任何比较。

我即将开始一个网络项目,我想使用Poco或libCurl。我对我最初计划使用Boost.ASIO的光很感兴趣,但它没有HTTPS客户端实现。它确实有一个在Boost.ASIO中实现的示例HTTPS客户端,但没有实际的协议处理程序。

  1. 这并不重要。瓶颈几乎肯定是网络媒体,或者你在HTTPS连接上进行的任何处理。SSL在CPU时间方面很便宜。(不幸的是,就网络延迟而言,它并不便宜,但库性能在这方面并不重要)
  2. 性能总是一系列的权衡。要想知道哪个库最适合你,唯一的方法就是尝试其中的一些。最有可能的是,你会看到微不足道的差异

如果您想要https支持,最好使用libcurl。libcurl支持https和http over proxy,https over proxy。如果需要支持代理,则应仅设置HTTP_proxy环境变量。

Curl提供类似fwrite的回调,将数据写入缓冲区。

#include <curl/curl.h>
typedef struct {
    char* data;     // response data from server
    size_t size;    // response size of data
} MEMFILE;
MEMFILE*
memfopen() {
    MEMFILE* mf = (MEMFILE*) malloc(sizeof(MEMFILE));
    if (mf) {
        mf->data = NULL;
        mf->size = 0;
    }
    return mf;
}
void
memfclose(MEMFILE* mf) {
    if (mf->data) free(mf->data);
    free(mf);
}
size_t
memfwrite(char* ptr, size_t size, size_t nmemb, void* stream) {
    MEMFILE* mf = (MEMFILE*) stream;
    int block = size * nmemb;
    if (!mf) return block; // through
    if (!mf->data)
        mf->data = (char*) malloc(block);
    else
        mf->data = (char*) realloc(mf->data, mf->size + block);
    if (mf->data) {
        memcpy(mf->data + mf->size, ptr, block);
        mf->size += block;
    }
    return block;
}
char*
memfstrdup(MEMFILE* mf) {
    char* buf;
    if (mf->size == 0) return NULL;
    buf = (char*) malloc(mf->size + 1);
    memcpy(buf, mf->data, mf->size);
    buf[mf->size] = 0;
    return buf;
}
int main() {
    CURL* curl;
    MEMFILE* mf;
    char* ptr;
    mf = memfopen();
    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, "https://github.com");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, mf);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memfwrite);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    ptr = memfstrdup(mf);
    printf("%sn", ptr);
    free(ptr);
    memfclose(mf);
}