我有一些Go代码,我一直在修补,以回答我与我的姐夫玩的视频游戏有关的一点好奇心.
从本质上讲,下面的代码模拟了游戏中与怪物的交互,以及他们在失败时可以预期他们丢弃物品的频率.我遇到的问题是,我希望像这样的代码片段非常适合并行化,但是当我添加并发时,所有模拟所需的时间往往会减慢原始速度的4-6倍没有并发.
为了让您更好地理解代码的工作原理,我有三个主要功能:交互功能,它是玩家和怪物之间的简单交互.如果怪物掉落一个物品则返回1,否则返回0.模拟函数运行多个交互并返回一片交互结果(即,1和0表示成功/不成功的交互).最后,还有一个测试函数,它运行一组模拟并返回一段模拟结果,这些结果是导致项目被删除的交互总数.这是我试图并行运行的最后一个功能.
现在,我可以理解为什么如果我为每个要运行的测试创建一个goroutine,代码会变慢.假设我正在运行100次测试,我的MacBook Air上的4个CPU之间的每个goroutine之间的上下文切换会导致性能下降,但我只创建了与处理器一样多的goroutine并将测试次数除以够程.我希望这实际上加快了代码的性能,因为我并行运行每个测试,但是,当然,我的主要是减速.
我很想知道为什么会这样,所以任何帮助都会非常感激.
以下是没有go例程的常规代码:
package main
import (
"fmt"
"math/rand"
"time"
)
const (
NUMBER_OF_SIMULATIONS = 1000
NUMBER_OF_INTERACTIONS = 1000000
DROP_RATE = 0.0003
)
/**
* Simulates a single interaction with a monster
*
* Returns 1 if the monster dropped an item and 0 otherwise
*/
func interaction() int {
if rand.Float64() <= DROP_RATE {
return 1
}
return 0
}
/**
* Runs several interactions and retuns a slice representing the results
*/
func simulation(n …Run Code Online (Sandbox Code Playgroud)