Repository metrics
- Stars
- (133,883 stars)
- PR merge metrics
- (No merged PRs in 30d)
Description
Here is trivial program that makes GET request:
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
resp, _ := http.Get("https://ifconfig.me")
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Print(string(body))
}
When compiled and run on Darwin system (using binary distribution), it have more or less expected performance -- twice as slow compared to curl.
$ /usr/bin/time ./hello
173.66.169.194 0.25 real 0.05 user 0.01 sys
$ /usr/bin/time curl https://ifconfig.me
173.66.169.194 0.12 real 0.01 user 0.01 sys
But when I compile and run it on my Linux box (Linux void-live 5.13.13_1 #1 SMP Fri Aug 27 13:28:13 UTC 2021 x86_64 GNU/Linux),
also using binary distribution, I get following results:
$ time ./hello
173.66.169.194
real 0m 1.03s
user 0m 1.30s
sys 0m 0.14s
$ time curl https://ifconfig.me
173.66.169.194
real 0m 0.16s
user 0m 0.06s
sys 0m 0.00s
Difference is much bigger. This time seems to come from some one-time initialization -- second request made in same program is fast. Here is annotated strace. It looks like it is doing many "rt_sigreturn" calls, but this is just my guess.
I have access to another linux box, with unusual kernel (lacking madvise(2), for example), which have more of the same problem: first request takes around 4 seconds, any subsequent work as expected.