]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: NetlinkRIB, avoid allocation in loop
authorCristian Staretu <unclejacksons@gmail.com>
Wed, 9 Jul 2014 08:50:38 +0000 (18:50 +1000)
committerDave Cheney <dave@cheney.net>
Wed, 9 Jul 2014 08:50:38 +0000 (18:50 +1000)
NetlinkRIB is currently allocating a page sized slice of bytes in a
for loop and it's also calling Getpagesize() in the same for loop.

This CL changes NetlinkRIB to preallocate the page sized slice of
bytes before reaching the for loop. This reduces memory allocations
and lowers the number of calls to Getpagesize() to 1 per NetlinkRIB
call.

This CL reduces the allocated memory from 141.5 MB down to 52 MB in
a test.

LGTM=crawshaw, dave
R=dave, dsymonds, crawshaw
CC=bradfitz, dsymonds, golang-codereviews
https://golang.org/cl/110920043

src/pkg/syscall/netlink_linux.go

index 49550ea2f021b5171718e8fe61a674fc74c0ad23..1b73dce8274355b5c153d2faaf559e40637227bf 100644 (file)
@@ -64,9 +64,10 @@ func NetlinkRIB(proto, family int) ([]byte, error) {
                return nil, err
        }
        var tab []byte
+       rbNew := make([]byte, Getpagesize())
 done:
        for {
-               rb := make([]byte, Getpagesize())
+               rb := rbNew
                nr, _, err := Recvfrom(s, rb, 0)
                if err != nil {
                        return nil, err