初学go语言,请教生成随机数为何线程越多速度越慢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初学go语言,请教生成随机数为何线程越多速度越慢?相关的知识,希望对你有一定的参考价值。

初学go,想生成大量随机数,是否重复先忽略,参考网上教程修改出如下代码:
package main

import (
"flag"
"fmt"
"math/rand"
"runtime"
"strconv"
"time"
)

var md = flag.String("cs", "", "cs=要使用几个核心,默认使用全部核心")

func main()
mc := runtime.NumCPU()

flag.Parse()
if *md != ""
mc1, err := strconv.Atoi(*md)
if err == nil
if mc != 0
mc = mc1
else
fmt.Println("使用核心数不能为 0 !")



runtime.GOMAXPROCS(mc)

const COUNT int = 15000000

r := make([]int, COUNT)
ch := make(chan int)

t1 := time.Now()
for i := 0; i < mc; i++
println(i*COUNT/mc, (i+1)*COUNT/mc)
go sj(i*COUNT/mc, (i+1)*COUNT/mc, r, ch)


temp := 0
for i := 0; i < mc; i++
temp += <-ch


t2 := time.Since(t1)
println(temp)
fmt.Println(mc, "个线程用时:", t2)


func sj(from, to int, r []int, ch chan int)
for i := from; i < to; i++
r[i] = rand.Intn(100)

ch <- to - from

原教程是多线程求和,我只是把求和改成了r[i] = rand.Intn(100)。
原求和程序随着设置核心数增加,用时基本是/n,而我这个生成随机数恰好相反,用的核心越多,耗时越多,基本是*n比如:
1 个线程用时: 420.7673ms
2 个线程用时: 776.2297ms
4 个线程用时: 1.4236043s
请问问题出在哪里?
谢谢!

参考技术A #include <stdio.h>
#include <stdlib.h>
#include <time.h> //用到了time函数
int main()
int i,number;
srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
for (i=0; i<50; i++)

number = rand() % 101; //产生0-100的随机数
printf("%d ", number);

return 0;

excel版本越高VBA运行速度越慢,为啥?

参考技术A 这跟EXCEL版本要求有关,版本越高,对硬件要求也越高,你的机子没变,版本变了,你就感觉运行慢了。跟VBA没有关系的。

以上是关于初学go语言,请教生成随机数为何线程越多速度越慢?的主要内容,如果未能解决你的问题,请参考以下文章

递归泛型类型的实例化速度越慢,嵌套越深。为啥?

excel版本越高VBA运行速度越慢,为啥?

并行代码扩展性差

excel版本越高VBA运行速度越慢,为啥?

网站性能优化你需知道的东西

JavaScript的DOM编程