小编icz*_*cza的帖子

矩阵乘法与goroutine降低性能

我正在通过Go中的goroutines优化矩阵乘法.

我的基准测试显示,每行或每个元素引入并发性会大大降低性能:

goos: darwin
goarch: amd64
BenchmarkMatrixDotNaive/A.MultNaive-8                            2000000               869 ns/op               0 B/op          0 allocs/op
BenchmarkMatrixDotNaive/A.ParalMultNaivePerRow-8                  100000             14467 ns/op              80 B/op          9 allocs/op
BenchmarkMatrixDotNaive/A.ParalMultNaivePerElem-8                  20000             77299 ns/op             528 B/op         65 allocs/op
Run Code Online (Sandbox Code Playgroud)

我知道缓存局部性的一些基本的先验知识,每个元素并发性能会降低性能.但是,为什么即使在天真的版本中,每行仍然会降低性能?

事实上,我还写了一个块/平铺优化,它的vanilla版本(没有goroutine并发)甚至比天真版本更糟糕(这里不存在,让我们首先关注天真).

我在这做错了什么?为什么?如何在这里优化?

乘法:

package naive

import (
    "errors"
    "sync"
)

// Errors
var (
    ErrNumElements = errors.New("Error number of elements")
    ErrMatrixSize  = errors.New("Error size of matrix")
)

// Matrix is a 2d array
type Matrix struct {
    N    int
    data [][]float64
}

// New a size by size matrix …
Run Code Online (Sandbox Code Playgroud)

concurrency go matrix-multiplication goroutine

1
推荐指数
1
解决办法
204
查看次数

如何从嵌套xml中获取数据,而在重复项中不使用结束标签?

根据下面的链接,我们可以使用>或其他结构从嵌套的xml中获取数据。

如何将嵌套的XML元素解组到数组中?

但是,在不使用这种结束标记的情况下,它不起作用。

码:

package main

import (
    "fmt"
    "encoding/xml"
)

func main() {

    container := Parent{}
    err := xml.Unmarshal([]byte(xml_data), &container)

    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(container)  
    }
}

var xml_data = `<Parent>
            <Val>Hello</Val>
                <Child Val="Hello"/>
                <Child Val="Hello"/>
                <Child Val="Hello"/>
        </Parent>`

type Parent struct {
    Val string
    Children Children
}

type Children struct {
    Child []Child
}

type Child struct {
    Val string
}
Run Code Online (Sandbox Code Playgroud)

结果:

{Hello {[]}}
Run Code Online (Sandbox Code Playgroud)

有什么办法吗?

xml struct go unmarshalling slice

1
推荐指数
1
解决办法
56
查看次数

JSON 嵌套动态结构 Go 解码

有一个关于输入数据的示例。

\n\n
{\n    "status": "OK",\n    "status_code": 100,\n    "sms": {\n        "79607891234": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79035671233": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79105432212": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        }\n    },\n    "balance": 2676.18\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
{\n    "status": "OK",\n    "status_code": 100,\n    "sms": {\n        "79607891234": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79035671233": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79105432212": {\n            "status": "ERROR",\n            "status_code": …
Run Code Online (Sandbox Code Playgroud)

json struct go

1
推荐指数
1
解决办法
540
查看次数

Go 生成的动画 GIF 在 Windows 中不起作用

我发现一个示例在 Windows 中无法正常工作。该程序演示了 Go 标准图像包的基本用法,我们将使用它来创建位图图像序列,然后将该序列编码为 GIF 动画。

package main

import (
    "image"
    "image/color"
    "image/gif"
    "io"
    "math"
    "math/rand"
    "os"
)

import (
    "log"
    "net/http"
    "time"
)

//!+main

var palette = []color.Color{color.White, color.Black}

const (
    whiteIndex = 0 // first color in palette
    blackIndex = 1 // next color in palette
)

func main() {
    //!-main
    // The sequence of images is deterministic unless we seed
    // the pseudo-random number generator using the current time.
    // Thanks to Randall McPherson for pointing …
Run Code Online (Sandbox Code Playgroud)

image file gif go

1
推荐指数
1
解决办法
1204
查看次数

如何使用map [string] * string

我正在尝试使用sarama(管理员模式)创建主题。如果没有ConfigEntries,则可以正常运行。但是我需要定义一些配置。

我设置了主题配置(这里发生了错误):

    tConfigs := map[string]*string{
        "cleanup.policy":      "delete",
        "delete.retention.ms": "36000000",
    }
Run Code Online (Sandbox Code Playgroud)

但是然后我得到一个错误:

./main.go:99:28: cannot use "delete" (type string) as type *string in map value
./main.go:100:28: cannot use "36000000" (type string) as type *string in map value
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用这样的管理模式:

err = admin.CreateTopic(t.Name, &sarama.TopicDetail{
    NumPartitions:     1,
    ReplicationFactor: 3,
    ConfigEntries:     tConfigs,
}, false)
Run Code Online (Sandbox Code Playgroud)

这是sarama模块中定义CreateTopic()的代码行, 网址为https://github.com/Shopify/sarama/blob/master/admin.go#L18

基本上,我不了解指针字符串的映射是如何工作的:)

string dictionary pointers go sarama

1
推荐指数
1
解决办法
50
查看次数

使用iota定义const变量时如何跳过很多值?

说我有下一个C程序:

#include <stdio.h>

int main(int args, char* argv[])
{
    enum RC {
        APPLE=0,
        ORANGE,
        PEAR,
        BANANA=99,
        GRAPE
    };

    printf("%d, %d, %d, %d, %d\n", APPLE, ORANGE, PEAR, BANANA, GRAPE);
}
Run Code Online (Sandbox Code Playgroud)

输出为:

0、1、2、99、100

如果进行中,如何使用a more golang way来处理呢?

实际上,如果我只是想跳过一些值。例如print 0, 1, 2, 5, 6,那么我可以使用next跳过一些值,但是在这里我需要跳过96个值...

package main

import "fmt"

func main() {
    const (
        APPLE = iota
        ORANGE
        PEAR
        _
        _
        BANANA
        GRAPE
    )
    fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
}
Run Code Online (Sandbox Code Playgroud)

并且,我也可以使用next,但是在GRAPE... 之后我仍然有很多const变量。

package main

import "fmt"

func main() {
    const …
Run Code Online (Sandbox Code Playgroud)

enums const go iota

1
推荐指数
1
解决办法
64
查看次数

如果 GOMAXPROCS 太大怎么办?

我们都知道runtime.GOMAXPROCS默认设置为CPU核心数,如果这个属性设置过大怎么办?

  1. 程序会有更多的上下文切换吗?
  2. 垃圾收集器会更频繁地触发吗?

performance garbage-collection go

1
推荐指数
1
解决办法
1341
查看次数

如果我不需要响应,是否需要 resp.Body.Close() ?

我正在提出请求,但不需要回复。如果我这样做会产生任何问题吗?

client = &http.Client{
    Timeout: time.Duration(15 * time.Second),
}
...
...
_, err := client.Do(req)
Run Code Online (Sandbox Code Playgroud)

http go

1
推荐指数
1
解决办法
2619
查看次数

如何在 3 秒内打印此 Go 代码?

这是 Go 代码 https://www.intervue.io/sandbox-ILSCXZ6RR

func worker() chan int {
   ch := make(chan int)

   go func() {
      time.Sleep(3 * time.Second)
      ch <- 42
   }()

   return ch
}

func main() {
   timeStart := time.Now()

   _, _ = <-worker(), <-worker()

   println(int(time.Since(timeStart).Seconds())) // 3 or 6 ?
}
Run Code Online (Sandbox Code Playgroud)

如何在 3 秒内执行而不是在 6 秒内执行?

concurrency time channel go goroutine

1
推荐指数
1
解决办法
176
查看次数

goroutine创建多个mongodb连接

如何在golang中管理超过100000个goroutine的MongoDB连接。

我创建了一个*mongo.Client实例,然后使用同一个客户端,但它创建了多个连接。

go mongodb mongo-go

1
推荐指数
1
解决办法
1225
查看次数