卷曲表达式之间的差异

时间:2016-03-21 10:47:25

标签: linux curl time libcurl

我有一个在localhost:3000运行的API服务器,我试图用这两个表达式查询它:

[wani@lenovo ilparser-docker]$ time (curl "localhost:3000/parse?lang=hin&data=देश" )
{"tokenizer":"<Sentence id=\"1\">\n1\tदेश\tunk\n<\/Sentence>\n"}
real    0m0.023s
user    0m0.009s
sys 0m0.004s
[wani@lenovo ilparser-docker]$ time (curl -XGET localhost:3000/parse -F lang=hin -F data="देश" )
{"tokenizer":"<Sentence id=\"1\">\n1\tदेश\tunk\n<\/Sentence>\n"}
real    0m1.101s
user    0m0.020s
sys 0m0.070s

为什么第二个表达需要花费更多时间?

更详细:

[wani@lenovo ilparser-docker]$ time curl -v localhost:3000/parse -F lang=hin -F data="देश"
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3000 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
> POST /parse HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Length: 244
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------1eb5e5991b976cb1
> 
* Done waiting for 100-continue
< HTTP/1.1 200 OK
< Content-Length: 70
< Server: Mojolicious (Perl)
< Content-Type: application/json;charset=UTF-8
< Date: Mon, 21 Mar 2016 11:06:09 GMT
< Connection: keep-alive
< 
* Connection #0 to host localhost left intact
{"tokenizer":"<Sentence id=\"1\">\n1\tदेश\tunk\n<\/Sentence>\n"}
real    0m1.106s
user    0m0.027s
sys 0m0.068s
[wani@lenovo ilparser-docker]$ time curl -v localhost:3000/parse --data lang=hin --data data="देश"
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3000 (#0)
> POST /parse HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Length: 23
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 23 out of 23 bytes
< HTTP/1.1 200 OK
< Server: Mojolicious (Perl)
< Content-Length: 70
< Connection: keep-alive
< Date: Mon, 21 Mar 2016 11:06:24 GMT
< Content-Type: application/json;charset=UTF-8
< 
* Connection #0 to host localhost left intact
{"tokenizer":"<Sentence id=\"1\">\n1\tदेश\tunk\n<\/Sentence>\n"}
real    0m0.031s
user    0m0.011s
sys 0m0.003s

Expect: 100-continue听起来很腥,所以我清除了标题:

[wani@lenovo ilparser-docker]$ time curl -v -F lang=hin -F data="देश" "localhost:3000/parse" -H Expect: --trace-time
16:48:04.513691 *   Trying 127.0.0.1...
16:48:04.513933 * Connected to localhost (127.0.0.1) port 3000 (#0)
16:48:04.514083 * Initializing NSS with certpath: sql:/etc/pki/nssdb
16:48:04.610095 > POST /parse HTTP/1.1
16:48:04.610095 > Host: localhost:3000
16:48:04.610095 > User-Agent: curl/7.43.0
16:48:04.610095 > Accept: */*
16:48:04.610095 > Content-Length: 244
16:48:04.610095 > Content-Type: multipart/form-data; boundary=------------------------24f30647b16ba82d
16:48:04.610095 > 
16:48:04.618107 < HTTP/1.1 200 OK
16:48:04.618194 < Content-Length: 70
16:48:04.618249 < Server: Mojolicious (Perl)
16:48:04.618306 < Content-Type: application/json;charset=UTF-8
16:48:04.618370 < Date: Mon, 21 Mar 2016 11:18:04 GMT
16:48:04.618430 < Connection: keep-alive
16:48:04.618492 < 
16:48:04.618590 * Connection #0 to host localhost left intact
{"tokenizer":"<Sentence id=\"1\">\n1\tदेश\tunk\n<\/Sentence>\n"}
real    0m0.117s
user    0m0.023s
sys 0m0.082s

现在唯一剩下的东西是:Initializing NSS with certpath: sql:/etc/pki/nssdb。为什么curl会在这种情况下做到这一点?

1 个答案:

答案 0 :(得分:0)

在来自@DanielStenberg的IRC的一点帮助之后,我开始知道数据库负载存在是因为在这种情况下curl inits nss,因为curl需要一个良好的随机源用于-F的边界分隔符。 Curl可能已使用getrandom()系统调用或读取/dev/urandom中的位,因为边界分隔符不需要以任何方式加密安全,但curl只是想在其他一些地方安全随机,因此卷曲重用已有的随机函数。