登录
首页 >  Golang >  Go问答

为什么我不能通过同时计算切片的不同部分来加速我的程序?

来源:stackoverflow

时间:2024-04-18 22:12:34 457浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《为什么我不能通过同时计算切片的不同部分来加速我的程序?》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我编写了一个程序来计算查询和目标文档之间的相似度分数。草图如下:

type Dictionary struct {
    Documents map[int][]string
    Queries   map[int][]string
}

type Similarity struct {
    QID   int
    DocID int
    Sim   float64
}

func (dict * Dictionary) CalScore(qID, docID int) float64 {
    query := dict.Queries[qID]
    document := dict.Documents[docID]
    score := calculation(query, document) // some counting and calculation
    // for example: count how many words in query are also in document and so on,
    // like tf-idf things.
    return score
}

// Calculate the similarity scores for each group.
func SimWorker(index int, dict *Dictionary, simsList *[][]Similarity, wg *sync.WaitGroup) {
    defer wg.Done()
    for i, sim := range (*simsList)[index] {
        // Retrieving words from Dictionary and compute, pretty time consuming.
        (*simsList)[index][i].Sim = dict.CalScore(dict.Queries[sim.QID], dict.Documents[sim.DocID])
    }
}

func main() {
    dict := Dictionary{
        // All data filled in.
    }
    simsList := [][]Similarity{
        // Slice of groups of structs containing
        // pairs of query id and doc id.
        // All sims scores are 0.0 initially.
    }

    var wg sync.WaitGroup
    for i := range simsList {
        wg.Add(1)
        go SimWorker(i, &dict, &simsList, &wg)
    }
    wg.Wait() // wait until all goroutines finish

    // Next procedures to the simsList
}

基本上,我有一组查询-文档 id 对组,每个组内的查询 id 相同,而文档 id 均不同。过程非常简单,我只是从字典中获取字符串,然后应用一些算法计算分数。 首先,我按顺序完成了所有这些(不使用 goroutine),计算每组的分数需要几分钟,总共需要几个小时。然后我期望通过引入像上面这样的 goroutine 来提高速度。我为每个组创建了一个 goroutine,因为它们访问 dictionary[][]similarity 中的不同部分。但事实证明,速度并没有提高,反而有所下降(我使用的 goroutine 数量在 10 个左右)。为什么会发生这种情况以及如何改进程序以真正加快计算速度?


解决方案


将此行添加到您的入口点

runtime.GOMAXPROCS(runtime.NumCPU())

它允许使用您电脑中的所有核心。 如果没有这一行,您的程序将同时运行,但不是并行运行

GoDoc

今天关于《为什么我不能通过同时计算切片的不同部分来加速我的程序?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>