Вы не видите разницы, потому что подготовка данных для передачи в стандартные процедуры - это ваше узкое место. Это медленнее или быстрее, чем выполнение калькуляции.
Передача копии строк и столбцов не является хорошей стратегией. Это убивает представление.
Процедуры go могут считывать данные непосредственно из входной матрицы, которая доступна только для чтения. Здесь нет возможных условий гонки.
То же самое для вывода. Если подпрограмма go вычисляет умножение строки и столбца, она запишет результат в отдельную ячейку. Здесь также нет возможных условий гонки.
Что делать, это следующее. Определите структуру с двумя полями, одно для строки и одно для столбца для умножения.
Заполните буферизованный канал всеми возможными комбинациями строки и столбцов для умножения с (0,0) на (n-1, m-1).
Подпрограммы go, потребляющие структурыиз канала выполните вычисления и запишите результат непосредственно в выходную матрицу.
У вас также есть готовый канал, чтобы сигнализировать основной программе go, что вычисления выполнены. Когда процедура go закончила обработку struct (n-1, m-1), она закрывает завершенный канал.
Основная процедура go ожидает на готовом канале после записи всех структур. После закрытия готового канала печатается истекшее время. Мы можем использовать группу ожидания, чтобы дождаться, когда все подпрограммы go завершили свои вычисления.
Затем вы можете начать с подпрограммы go и увеличить количество подпрограмм go, чтобы увидеть влияние времени обработки.
См. Код:
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
type pair struct {
row, col int
}
const length = 1000
var start time.Time
var rez [length][length]int
func main() {
const threadlength = 1
pairs := make(chan pair, 1000)
var wg sync.WaitGroup
var a [length][length]int
var b [length][length]int
for i := 0; i < length; i++ {
for j := 0; j < length; j++ {
a[i][j] = rand.Intn(10)
b[i][j] = rand.Intn(10)
}
}
wg.Add(threadlength)
for i := 0; i < threadlength; i++ {
go Calc(pairs, &a, &b, &rez, &wg)
}
start = time.Now()
for i := 0; i < length; i++ {
for j := 0; j < length; j++ {
pairs <- pair{row: i, col: j}
}
}
close(pairs)
wg.Wait()
elapsed := time.Since(start)
fmt.Println("Binomial took ", elapsed)
for i := 0; i < length; i++ {
for j := 0; j < length; j++ {
fmt.Print(rez[i][j])
fmt.Print(" ")
}
fmt.Println(" ")
}
}
func Calc(pairs chan pair, a, b, rez *[length][length]int, wg *sync.WaitGroup) {
for {
pair, ok := <-pairs
if !ok {
break
}
rez[pair.row][pair.col] = 0
for i := 0; i < length; i++ {
rez[pair.row][pair.col] += a[pair.row][i] * b[i][pair.col]
}
}
wg.Done()
}