libcurl: моя реализация медленнее родного curl - PullRequest
0 голосов
/ 14 февраля 2019

Я экспериментировал с C и libcurl и заметил, что моя реализация занимает больше времени, чем нативная / usr / bin / curl , при выполнении простого HTTPS GET.

Вот мой источник:

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>


/*
#define SKIP_HOSTNAME_VERIFICATION
#define SKIP_PEER_VERIFICATION
*/

int try_url(char *url);

int main(int argc, char **argv){

    try_url(argv[1]);
    puts("Done");
    return 0;
}


int try_url(char *url){
  CURL *curl;
  CURLcode res;

  curl_global_init(CURL_GLOBAL_DEFAULT);

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

#ifdef SKIP_HOSTNAME_VERIFICATION
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
#endif

#ifdef SKIP_PEER_VERIFICATION
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
#endif

    res = curl_easy_perform(curl);
    if(res != CURLE_OK){
    fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    }

    curl_easy_cleanup(curl);
  }

  curl_global_cleanup();

  return 0;
}

Вот время, необходимое для его запуска:

$ time ./a.out "https://dns.google.com/resolve?name=dns.google.com&type=A" 2>/dev/null 
{"Status": 0,"TC": false,"RD": true,"RA": true,"AD": false,"CD": false,"Question":[ {"name": "dns.google.com.","type": 1}],"Answer":[ {"name": "dns.google.com.","type": 1,"TTL": 78,"data": "216.58.217.46"}]}Done

real    0m1.038s
user    0m0.746s
sys 0m0.109s

Вот собственный двоичный файл curl, заканчивая его всего за половину времени:

 $ time curl -o /dev/null  "https://dns.google.com/resolve?name=dns.google.com&type=A"  2>/dev/null

real    0m0.412s
user    0m0.196s
sys 0m0.020s

Не могли бы вы указать мне правильный путь?

Случается с другими URL Более подробная информация:

$ dpkg -l |egrep "curl|ssl"
ii  curl                            7.52.1-5+deb9u8              armhf        command line tool for transferring data with URL syntax
ii  libcurl3:armhf                  7.52.1-5+deb9u8              armhf        easy-to-use client-side URL transfer library (OpenSSL flavour)
ii  libcurl3-gnutls:armhf           7.52.1-5+deb9u9              armhf        easy-to-use client-side URL transfer library (GnuTLS flavour)
ii  libcurl4-gnutls-dev:armhf       7.52.1-5+deb9u9              armhf        development files and documentation for libcurl (GnuTLS flavour)
ii  libssl1.0.2:armhf               1.0.2q-1~deb9u1              armhf        Secure Sockets Layer toolkit - shared libraries
ii  libssl1.1:armhf                 1.1.0j-1~deb9u1              armhf        Secure Sockets Layer toolkit - shared libraries
ii  openssl                         1.1.0j-1~deb9u1              armhf        Secure Sockets Layer toolkit - cryptographic utility

ldd на моем a.out:

$ ldd a.out 
    linux-vdso.so.1 (0x7eed3000)
    /usr/lib/arm-linux-gnueabihf/libarmmem.so (0x76f65000)
    libcurl-gnutls.so.4 => /usr/lib/arm-linux-gnueabihf/libcurl-gnutls.so.4 (0x76eeb000)
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76dac000)
    libnghttp2.so.14 => /usr/lib/arm-linux-gnueabihf/libnghttp2.so.14 (0x76d7e000)
    libidn2.so.0 => /usr/lib/arm-linux-gnueabihf/libidn2.so.0 (0x76d4c000)
    librtmp.so.1 => /usr/lib/arm-linux-gnueabihf/librtmp.so.1 (0x76d23000)
    libssh2.so.1 => /usr/lib/arm-linux-gnueabihf/libssh2.so.1 (0x76cee000)
    libpsl.so.5 => /usr/lib/arm-linux-gnueabihf/libpsl.so.5 (0x76cd1000)
    libnettle.so.6 => /usr/lib/arm-linux-gnueabihf/libnettle.so.6 (0x76c8a000)
    libgnutls.so.30 => /usr/lib/arm-linux-gnueabihf/libgnutls.so.30 (0x76afd000)
    libgssapi_krb5.so.2 => /usr/lib/arm-linux-gnueabihf/libgssapi_krb5.so.2 (0x76ab4000)
    libkrb5.so.3 => /usr/lib/arm-linux-gnueabihf/libkrb5.so.3 (0x769fd000)
    libk5crypto.so.3 => /usr/lib/arm-linux-gnueabihf/libk5crypto.so.3 (0x769be000)
    libcom_err.so.2 => /lib/arm-linux-gnueabihf/libcom_err.so.2 (0x769ab000)
    liblber-2.4.so.2 => /usr/lib/arm-linux-gnueabihf/liblber-2.4.so.2 (0x7698f000)
    libldap_r-2.4.so.2 => /usr/lib/arm-linux-gnueabihf/libldap_r-2.4.so.2 (0x7693a000)
    libz.so.1 => /lib/arm-linux-gnueabihf/libz.so.1 (0x76913000)
    libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x768ea000)
    /lib/ld-linux-armhf.so.3 (0x76f7b000)
    libunistring.so.0 => /usr/lib/arm-linux-gnueabihf/libunistring.so.0 (0x767db000)
    libhogweed.so.4 => /usr/lib/arm-linux-gnueabihf/libhogweed.so.4 (0x7679e000)
    libgmp.so.10 => /usr/lib/arm-linux-gnueabihf/libgmp.so.10 (0x7672b000)
    libgcrypt.so.20 => /lib/arm-linux-gnueabihf/libgcrypt.so.20 (0x7665a000)
    libp11-kit.so.0 => /usr/lib/arm-linux-gnueabihf/libp11-kit.so.0 (0x765fa000)
    libidn.so.11 => /lib/arm-linux-gnueabihf/libidn.so.11 (0x765b9000)
    libtasn1.so.6 => /usr/lib/arm-linux-gnueabihf/libtasn1.so.6 (0x76599000)
    libkrb5support.so.0 => /usr/lib/arm-linux-gnueabihf/libkrb5support.so.0 (0x76580000)
    libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x7656d000)
    libkeyutils.so.1 => /lib/arm-linux-gnueabihf/libkeyutils.so.1 (0x7655a000)
    libresolv.so.2 => /lib/arm-linux-gnueabihf/libresolv.so.2 (0x76535000)
    libsasl2.so.2 => /usr/lib/arm-linux-gnueabihf/libsasl2.so.2 (0x7650e000)
    libgpg-error.so.0 => /lib/arm-linux-gnueabihf/libgpg-error.so.0 (0x764ee000)
    libffi.so.6 => /usr/lib/arm-linux-gnueabihf/libffi.so.6 (0x764d6000)
    libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x764a7000)

Обновление:

Взял libcurl4-gnutls-dev и установил libcurl4-openssl-dev

  498  apt-get remove libcurl4-gnutls-dev
  499  apt install libcurl4-openssl-dev

Сейчас он ведет себя намного лучше:

$ time curl -o /dev/null  "https://dns.google.com/resolve?name=dns.google.com&type=A"  2>/dev/null

real    0m0.302s
user    0m0.200s
sys 0m0.020s

$ time ./a.out  "https://dns.google.com/resolve?name=dns.google.com&type=A"  2>/dev/null 
{"Status": 0,"TC": false,"RD": true,"RA": true,"AD": false,"CD": false,"Question":[ {"name": "dns.google.com.","type": 1}],"Answer":[ {"name": "dns.google.com.","type": 1,"TTL": 299,"data": "216.58.217.46"}],"Comment": "Response from 2001:4860:4802:34::a."}Done

real    0m0.294s
user    0m0.196s
sys 0m0.020s
...