kouzdra (kouzdra) wrote,
kouzdra
kouzdra

Написал, кстати, тест на сортировку Батчера

Ради которого собственно и затевалось: с построением сортировочной сети. Перформанс ожидаемо упал раз в 60. Так что эффективность межпроцессного взаимодействия оставляет желать лучшего. Но зато изячно вышло:

package sThd

type t float64

func cmp (inA,  inB  <-chan t) (<- chan t, <- chan t) {
	outA := make(chan t, 0)
	outB := make(chan t, 0)
	go func () {
		for {
			a, b := <- inA, <- inB
			if a > b {
				outA <- b
				outB <- a
			} else {
				outA <- a
				outB <- b
			}
		}
	} ()
	return outA, outB
}

type vec [] <-chan t

func cmp_swp (x vec, a, b int) {
	x[a], x[b] = cmp(x[a], x[b])
}

func merge (x vec, lo, hi, r int) {
	step := r * 2
	if step < hi - lo {
		merge(x, lo, hi, step)
		merge(x, lo+r, hi, step)
		for i := lo+r; i < hi-r; i += step {
			cmp_swp(x, i, i+r)
		}
	} else {
		cmp_swp(x, lo, lo+r)
	}
}

func rng (x vec, lo, hi int) {
	if hi - lo >= 1 {
		mid := lo + (hi - lo) / 2
		rng(x, mid+1, hi)
		rng(x, lo,   mid)
		merge(x, lo, hi, 1)
	}
}

func makeNet (l int) ([]chan<- t, []<-chan t) {
	in  := make ([]chan<- t, l)
	out := make ([]<-chan t, l)
	for i := range in {
		c := make(chan t, 0);
		in [i], out [i] = c,c
	}
	rng(out, 0, l-1)
	return in, out
}


func Test(N, RPT int) {
	//	x := vec{2, 4, 3, 5, 6, 1, 7, 8}
	in, out := makeNet(N)
	for j := 0; j != RPT; j++ {
		for i := range in { in[i] <- t(N - i) }
//		for _, c := range out { fmt.Printf ("%g ", <- c) }
		for _, c := range out { <- c }
	}
}
Tags: go, Компутерщина
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments