Я экспериментировал с 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