Бенчмаркинг каналов с помощью простого теста пинг-понга - PullRequest
0 голосов
/ 04 января 2019

У меня есть простое 2-х файловое приложение.Я пытаюсь провести тестирование сообщений ping и pong на 2 каналах.

Цель состоит в том, чтобы запустить эталонный тест, чтобы увидеть, сколько можно выполнить ping и pong туда и обратно (вот почему я пропускаю попытки, чтобыбенчмарк может продолжать работать на разных входах)

По какой-то причине локально это отображается только при запуске:

go build
./main

Вывод:

ping
pong
ping
pong
ping
pong
ping
pong
ping  

Почемуэто конец после стольких итераций?

main.go

package main

import (
    "fmt"
)

func main() {

    PingPong(1000)

    var input string
    fmt.Scanln(input)
    fmt.Println("done!")
}

ping.go

package main

import "fmt"

func PingPong(attempts int) {
    pingCh := make(chan string)
    pongCh := make(chan string)

    go pinger(pingCh, pongCh)
    go ponger(pingCh, pongCh, attempts)

    pingCh <- "ping"
}

func pinger(pingCh chan string, pongCh chan string) {
    for {
        _ = <-pingCh
        fmt.Println("ping")
        pongCh <- "pong"
    }
}

func ponger(pingCh chan string, pongCh chan string, attempts int) {
    counter := 0
    for {
        msg := <-pongCh
        fmt.Println(msg)
        counter++
        if counter == attempts {
            fmt.Println(counter)
            break
        }
        pingCh <- "ping"
    }
}

ping_test.go

package main

import "testing"

func benchmarkPingPong(i int, b *testing.B) {
    for n := 0; n < b.N; n++ {
        PingPong(n)
    }
}

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Причина, по которой это не сработало, заключается в том, что я переместил файлы из main.go в ping.go.Когда я запустил go build, он создал другое двоичное имя ./pingpong, но я все еще использовал старый двоичный файл!

0 голосов
/ 04 января 2019

fmt.Scanln нужен указатель:
Используйте это:

fmt.Println(fmt.Scanln(&input))

Это работает для меня:

package main

import "fmt"

func main() {
    PingPong(1000)
    var input string
    fmt.Println(fmt.Scanln(&input))
    fmt.Println("done!")
}

func PingPong(attempts int) {
    pingCh := make(chan string)
    pongCh := make(chan string)

    go pinger(pingCh, pongCh)
    go ponger(pingCh, pongCh, attempts)

    pingCh <- "ping"
}

func pinger(pingCh chan string, pongCh chan string) {
    for {
        _ = <-pingCh
        fmt.Println("ping")
        pongCh <- "pong"
    }
}

func ponger(pingCh chan string, pongCh chan string, attempts int) {
    counter := 0
    for {
        msg := <-pongCh
        counter++
        fmt.Println(msg, counter)
        if counter == attempts {
            fmt.Println(counter)
            break
        }
        pingCh <- "ping"
    }
}

Вывод:

...
ping
pong 999
ping
pong 1000
1000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...