который является лучшим кодом для накладных расходов горутины

Я хочу сделать Reader.Read параллельным каналу связи. поэтому я сделал два способа запустить его

1:

type ReturnRead struct {
    n   int
    err error
}

type ReadGoSt struct {
    Returnc <-chan ReturnRead
    Nextc chan struct{}
}

func (st *ReadGoSt) Close() {
    defer func() {
        recover()
    }()
    close(st.Next)
}

func ReadGo(r io.Reader, b []byte) *ReadGoSt {
    returnc := make(chan ReturnRead)
    nextc := make(chan bool)

    go func() {
        for range nextc {
            n, err := r.Read(b)
            returnc <- ReturnRead{n, err}
            if err != nil {
                return
            }
        }
    }()

    return &ReadGoSt{returnc, nextc}
}

2:

func ReadGo(r io.Reader, b []byte) <-chan ReturnRead {
    returnc := make(chan ReturnRead)
    go func() {
        n, err := r.Read(b)
        returnc <- ReturnRead{n, err}
    }()
    return returnc
}

я думаю, что код 2 создает слишком много накладных расходов

какой код лучше? 1? 2?


person Doraemong    schedule 09.01.2015    source источник


Ответы (1)


Код 1 лучше и, вероятно, быстрее. Код 2 будет просто прочитан один раз. Но я думаю, что оба решения не самые лучшие. вы должны перебрать чтение и отправить обратно только прочитанные байты.

Что-то вроде: http://play.golang.org/p/zRPXOtdgWD

person fabrizioM    schedule 09.01.2015