Golang: net.Conn Read very slowly?

I use net.Listen ("tcp", addr) for a small server program that needs to receive data and store it on the server. On the client side, I have a C ++ program, and I just wrote 4,096,000 bytes to the socket (connected to my server program) Recording on the client side ends in less than a second. When using the Read () functions of a net.Conn connection, reading is very slow.

The following is a read () loop:

// Handle the reads var tbuf [81920]byte for { n, err := c.rwc.Read(tbuf[0:]) // Was there an error in reading ? if err != nil { log.Printf("Could not read packet : %s", err.Error()) break } log.Println(n) } return 

c.rwc is of type net.Conn

The output of the above code is as follows:

 2012/12/29 13:45:12 16384 2012/12/29 13:45:12 16018 2012/12/29 13:45:12 16384 2012/12/29 13:45:12 16016 2012/12/29 13:45:13 16384 2012/12/29 13:45:13 16016 2012/12/29 13:45:13 16384 2012/12/29 13:45:13 16016 2012/12/29 13:45:13 16384 2012/12/29 13:45:13 16016 2012/12/29 13:45:13 16384 2012/12/29 13:45:13 16016 2012/12/29 13:45:13 16384 2012/12/29 13:45:13 16016 2012/12/29 13:45:13 16384 2012/12/29 13:45:13 16016 2012/12/29 13:45:13 16384 2012/12/29 13:45:14 16016 2012/12/29 13:45:14 16384 2012/12/29 13:45:14 16016 2012/12/29 13:45:14 16384 2012/12/29 13:45:14 16016 2012/12/29 13:45:14 16384 2012/12/29 13:45:14 16016 2012/12/29 13:45:14 16384 2012/12/29 13:45:14 16016 2012/12/29 13:45:14 16384 2012/12/29 13:45:14 16016 2012/12/29 13:45:14 16384 2012/12/29 13:45:14 16016 2012/12/29 13:45:15 16384 2012/12/29 13:45:15 16016 2012/12/29 13:45:15 16384 2012/12/29 13:45:15 16016 2012/12/29 13:45:15 16384 2012/12/29 13:45:15 16016 2012/12/29 13:45:15 16384 2012/12/29 13:45:15 16016 2012/12/29 13:45:15 16384 2012/12/29 13:45:15 16016 2012/12/29 13:45:15 16384 2012/12/29 13:45:15 16016 2012/12/29 13:45:15 16384 2012/12/29 13:45:16 16016 2012/12/29 13:45:16 16384 2012/12/29 13:45:16 16016 2012/12/29 13:45:16 16384 2012/12/29 13:45:16 16016 2012/12/29 13:45:16 16384 2012/12/29 13:45:16 16016 2012/12/29 13:45:16 16384 2012/12/29 13:45:16 16016 2012/12/29 13:45:18 16384 2012/12/29 13:45:18 16016 2012/12/29 13:45:19 16384 2012/12/29 13:45:19 16016 2012/12/29 13:45:19 16384 2012/12/29 13:45:19 16016 2012/12/29 13:45:19 16384 2012/12/29 13:45:19 16016 2012/12/29 13:45:19 16384 2012/12/29 13:45:19 16016 2012/12/29 13:45:19 16384 2012/12/29 13:45:19 16016 2012/12/29 13:45:19 16384 2012/12/29 13:45:19 16016 2012/12/29 13:45:19 16384 2012/12/29 13:45:20 16016 2012/12/29 13:45:20 16384 2012/12/29 13:45:20 16016 2012/12/29 13:45:20 16384 2012/12/29 13:45:20 16016 2012/12/29 13:45:20 16384 2012/12/29 13:45:20 16016 2012/12/29 13:45:20 16384 2012/12/29 13:45:20 16016 2012/12/29 13:45:20 16384 2012/12/29 13:45:20 16016 2012/12/29 13:45:20 16384 2012/12/29 13:45:20 16016 2012/12/29 13:45:21 16384 2012/12/29 13:45:21 16016 2012/12/29 13:45:21 16384 2012/12/29 13:45:21 16016 2012/12/29 13:45:21 16384 2012/12/29 13:45:21 16016 2012/12/29 13:45:21 16384 2012/12/29 13:45:21 16016 2012/12/29 13:45:21 16384 2012/12/29 13:45:21 16016 2012/12/29 13:45:21 16384 2012/12/29 13:45:21 16016 2012/12/29 13:45:21 16384 2012/12/29 13:45:22 16016 2012/12/29 13:45:22 16384 2012/12/29 13:45:22 16016 2012/12/29 13:45:22 16384 2012/12/29 13:45:22 16016 2012/12/29 13:45:22 16384 2012/12/29 13:45:22 16016 2012/12/29 13:45:22 16384 2012/12/29 13:45:22 16016 2012/12/29 13:45:22 16384 2012/12/29 13:45:22 16016 2012/12/29 13:45:22 16384 2012/12/29 13:45:22 16016 2012/12/29 13:45:23 16384 2012/12/29 13:45:23 16016 2012/12/29 13:45:23 16384 2012/12/29 13:45:23 16016 2012/12/29 13:45:23 16384 2012/12/29 13:45:23 16016 2012/12/29 13:45:23 16384 2012/12/29 13:45:23 16016 2012/12/29 13:45:23 16384 2012/12/29 13:45:23 16016 2012/12/29 13:45:23 16384 2012/12/29 13:45:23 16016 2012/12/29 13:45:24 16384 2012/12/29 13:45:24 16016 2012/12/29 13:45:24 16384 2012/12/29 13:45:24 16016 2012/12/29 13:45:24 16384 2012/12/29 13:45:24 16016 2012/12/29 13:45:24 16384 2012/12/29 13:45:24 16016 2012/12/29 13:45:24 16384 2012/12/29 13:45:24 16016 2012/12/29 13:45:24 16384 2012/12/29 13:45:24 16016 2012/12/29 13:45:24 16384 2012/12/29 13:45:25 16016 2012/12/29 13:45:25 16384 2012/12/29 13:45:25 16016 2012/12/29 13:45:25 16384 2012/12/29 13:45:25 16016 2012/12/29 13:45:25 16384 2012/12/29 13:45:25 16016 2012/12/29 13:45:25 16384 2012/12/29 13:45:25 16016 2012/12/29 13:45:25 16384 2012/12/29 13:45:25 16016 2012/12/29 13:45:25 16384 2012/12/29 13:45:26 16016 2012/12/29 13:45:26 16384 2012/12/29 13:45:26 16016 2012/12/29 13:45:26 16384 2012/12/29 13:45:26 16016 2012/12/29 13:45:26 16384 2012/12/29 13:45:26 16016 2012/12/29 13:45:26 16384 2012/12/29 13:45:26 16016 2012/12/29 13:45:26 16384 2012/12/29 13:45:26 16016 2012/12/29 13:45:26 16384 2012/12/29 13:45:26 16016 2012/12/29 13:45:27 16384 2012/12/29 13:45:27 16016 2012/12/29 13:45:27 16384 2012/12/29 13:45:27 16016 2012/12/29 13:45:27 16384 2012/12/29 13:45:27 16016 2012/12/29 13:45:27 16384 2012/12/29 13:45:27 16016 2012/12/29 13:45:27 16384 2012/12/29 13:45:28 16016 2012/12/29 13:45:28 16384 2012/12/29 13:45:29 16016 2012/12/29 13:45:29 16384 2012/12/29 13:45:29 16016 2012/12/29 13:45:29 16384 2012/12/29 13:45:29 16016 2012/12/29 13:45:29 16384 2012/12/29 13:45:29 16016 2012/12/29 13:45:29 16384 2012/12/29 13:45:29 16016 2012/12/29 13:45:29 16384 2012/12/29 13:45:29 16016 2012/12/29 13:45:29 16384 2012/12/29 13:45:30 16016 2012/12/29 13:45:30 16384 2012/12/29 13:45:30 16016 2012/12/29 13:45:30 16384 2012/12/29 13:45:30 16016 2012/12/29 13:45:30 16384 2012/12/29 13:45:30 16016 2012/12/29 13:45:30 16384 2012/12/29 13:45:30 16016 2012/12/29 13:45:31 16384 2012/12/29 13:45:31 16016 2012/12/29 13:45:31 16384 2012/12/29 13:45:31 16016 2012/12/29 13:45:32 16384 2012/12/29 13:45:32 16016 2012/12/29 13:45:32 16384 2012/12/29 13:45:32 16016 2012/12/29 13:45:32 16384 2012/12/29 13:45:32 16016 2012/12/29 13:45:32 16384 2012/12/29 13:45:32 16016 2012/12/29 13:45:32 16384 2012/12/29 13:45:32 16016 2012/12/29 13:45:32 16384 2012/12/29 13:45:32 16016 2012/12/29 13:45:32 16384 2012/12/29 13:45:33 16016 2012/12/29 13:45:33 16384 2012/12/29 13:45:33 16016 2012/12/29 13:45:33 16384 2012/12/29 13:45:33 16016 2012/12/29 13:45:33 16384 2012/12/29 13:45:33 16016 2012/12/29 13:45:33 16384 2012/12/29 13:45:33 16016 2012/12/29 13:45:33 16384 2012/12/29 13:45:33 16016 2012/12/29 13:45:33 16384 2012/12/29 13:45:34 16016 2012/12/29 13:45:34 16384 2012/12/29 13:45:34 16016 2012/12/29 13:45:34 16384 2012/12/29 13:45:34 16016 2012/12/29 13:45:34 16384 2012/12/29 13:45:34 16016 2012/12/29 13:45:34 16384 2012/12/29 13:45:34 16016 2012/12/29 13:45:34 16384 2012/12/29 13:45:34 16016 2012/12/29 13:45:34 16384 2012/12/29 13:45:35 16016 2012/12/29 13:45:35 16384 2012/12/29 13:45:35 16016 2012/12/29 13:45:35 16384 2012/12/29 13:45:35 16016 2012/12/29 13:45:35 16384 2012/12/29 13:45:35 16016 2012/12/29 13:45:36 16384 2012/12/29 13:45:36 16016 2012/12/29 13:45:36 16384 2012/12/29 13:45:36 16016 2012/12/29 13:45:37 16384 2012/12/29 13:45:37 16016 2012/12/29 13:45:37 16384 2012/12/29 13:45:37 16016 2012/12/29 13:45:37 16384 2012/12/29 13:45:37 16016 2012/12/29 13:45:37 16384 2012/12/29 13:45:37 16016 2012/12/29 13:45:37 16384 2012/12/29 13:45:37 16016 2012/12/29 13:45:37 4048 

As you can see, the read operation takes almost 21-25 seconds to read 4,096,000 bytes, which is very slow because the server and the client are on the same computer. Does the read operation work? I can’t understand why it is so slow?

+4
source share
1 answer

I took your example and made it a complete example for the client and server in go. When testing it on Linux, it transfers data in 20 ms or so without unexpected pauses.

Do you get the same results if you try it on your computer? If so, then suspect the C ++ part of your system. If you get the same pauses as your original post, then you suspect that you have tuned.

server code

 package main import ( "io" "log" "net" "time" ) func handle(c net.Conn) { // Handle the reads start := time.Now() tbuf := make([]byte, 81920) totalBytes := 0 for { n, err := c.Read(tbuf) totalBytes += n // Was there an error in reading ? if err != nil { if err != io.EOF { log.Printf("Read error: %s", err) } break } log.Println(n) } log.Printf("%d bytes read in %s", totalBytes, time.Now().Sub(start)) c.Close() } func main() { srv, err := net.Listen("tcp", ":2000") if err != nil { log.Fatal(err) } log.Println("Listening on localhost:2000") for { conn, err := srv.Accept() if err != nil { log.Fatal(err) } go handle(conn) } } 

Client code

 package main import ( "log" "net" "time" ) func handle(c net.Conn) { start := time.Now() tbuf := make([]byte, 4096) totalBytes := 0 for i := 0; i < 1000; i++ { n, err := c.Write(tbuf) totalBytes += n // Was there an error in writing? if err != nil { log.Printf("Write error: %s", err) break } log.Println(n) } log.Printf("%d bytes written in %s", totalBytes, time.Now().Sub(start)) c.Close() } func main() { conn, err := net.Dial("tcp", ":2000") if err != nil { log.Fatal(err) } log.Println("Sending to localhost:2000") handle(conn) } 
+8
source

All Articles