小编Chr*_*ach的帖子

为什么添加并发会减慢这个golang代码?

我有一些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)

concurrency go

43
推荐指数
2
解决办法
1万
查看次数

标签 统计

concurrency ×1

go ×1