分享
Go语言排序一千万个随机数.开的双核.用了120秒,不知道怎么优化.然后自己调整了一下参数跑了一下34秒
fyxichen · · 2458 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
自己没事调整了一下参数,然后从新跑了一下,时间缩短为34秒,结果还可以.
package main
import (
"fmt"
"os"
"runtime"
"test"
"time"
)
var x chan []int = make(chan []int, 1)
var Num int = 10 //改为100
var WNum int = 100
func main() {
fmt.Println(time.Now())
var list1, list2 []int
var R chan []int = make(chan []int, 1)
for i := 0; i < WNum; i++ {
go Chan(Num, R)
}
for i := 0; i < WNum; i++ {
select {
case y := <-R:
if len(list1) == 0 {
list1 = y
} else {
list2 = y
list1 = test.Merge(list1, list2)
}
}
}
fmt.Println(time.Now())
fmt.Println(len(list1))
File, _ := os.OpenFile("c.txt", os.O_RDWR|os.O_CREATE, 0777)
File.Write([]byte(fmt.Sprint(list1)))
File.Close()
}
func Chan(Num int, R chan []int) {
var list1, list2 []int
runtime.GOMAXPROCS(2)
for i := 0; i < Num; i++ {
go func() {
x <- test.Rand_list(10000) <span style="font-family: Arial, Helvetica, sans-serif;">//改为1000</span>
}()
}
for i := 0; i < Num; i++ {
select {
case y := <-x:
if len(list1) == 0 {
list1 = y
} else {
list2 = y
list1 = test.Merge(list1, list2)
}
}
}
R <- list1
}目录:test下
package test
import (
"math/rand"
)
func Rand_list(Num int) []int {
var list []int
for i := 0; i < Num; i++ {
list = append(list, rand.Intn(100000))
}
for i := 0; i < Num; i++ {
for j := i + 1; j < Num; j++ {
if list[i] > list[j] {
list[i], list[j] = list[j], list[i]
}
}
}
return list
}
package test
func Merge(list1, list2 []int) []int {
list1_Num := len(list1)
list2_Num := len(list2)
var j int = 0
var list3 []int
for i, _ := range list1 {
This:
if list1[i] <= list2[j] {
list3 = append(list3, list1[i])
if i == list1_Num-1 {
for z := j; z < list2_Num; z++ {
list3 = append(list3, list2[z])
}
break
}
} else {
if j <= list2_Num-1 {
list3 = append(list3, list2[j])
if j == list2_Num-1 {
for j := i; j < list1_Num; j++ {
list3 = append(list3, list1[j])
}
break
}
j++
goto This
}
}
}
return list3
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信2458 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
自己没事调整了一下参数,然后从新跑了一下,时间缩短为34秒,结果还可以.
package main
import (
"fmt"
"os"
"runtime"
"test"
"time"
)
var x chan []int = make(chan []int, 1)
var Num int = 10 //改为100
var WNum int = 100
func main() {
fmt.Println(time.Now())
var list1, list2 []int
var R chan []int = make(chan []int, 1)
for i := 0; i < WNum; i++ {
go Chan(Num, R)
}
for i := 0; i < WNum; i++ {
select {
case y := <-R:
if len(list1) == 0 {
list1 = y
} else {
list2 = y
list1 = test.Merge(list1, list2)
}
}
}
fmt.Println(time.Now())
fmt.Println(len(list1))
File, _ := os.OpenFile("c.txt", os.O_RDWR|os.O_CREATE, 0777)
File.Write([]byte(fmt.Sprint(list1)))
File.Close()
}
func Chan(Num int, R chan []int) {
var list1, list2 []int
runtime.GOMAXPROCS(2)
for i := 0; i < Num; i++ {
go func() {
x <- test.Rand_list(10000) <span style="font-family: Arial, Helvetica, sans-serif;">//改为1000</span>
}()
}
for i := 0; i < Num; i++ {
select {
case y := <-x:
if len(list1) == 0 {
list1 = y
} else {
list2 = y
list1 = test.Merge(list1, list2)
}
}
}
R <- list1
}目录:test下
package test
import (
"math/rand"
)
func Rand_list(Num int) []int {
var list []int
for i := 0; i < Num; i++ {
list = append(list, rand.Intn(100000))
}
for i := 0; i < Num; i++ {
for j := i + 1; j < Num; j++ {
if list[i] > list[j] {
list[i], list[j] = list[j], list[i]
}
}
}
return list
}
package test
func Merge(list1, list2 []int) []int {
list1_Num := len(list1)
list2_Num := len(list2)
var j int = 0
var list3 []int
for i, _ := range list1 {
This:
if list1[i] <= list2[j] {
list3 = append(list3, list1[i])
if i == list1_Num-1 {
for z := j; z < list2_Num; z++ {
list3 = append(list3, list2[z])
}
break
}
} else {
if j <= list2_Num-1 {
list3 = append(list3, list2[j])
if j == list2_Num-1 {
for j := i; j < list1_Num; j++ {
list3 = append(list3, list1[j])
}
break
}
j++
goto This
}
}
}
return list3
}