Go:基于类的方法是否比功能更高效?

Bri*_*itt 1 performance functional-programming class go

我很好奇在这些结构上使用结构和函数的基于类的方法在 Golang 中是否性能更高?

到目前为止,我还无法找到任何比较这两种不同技术的资源。

这个问题是在一次对话中提出的,当时我被告知使用基于类的方法进行编码在 Javascript 中比函数式编码的性能更高。

jon*_*oun 8

你实际上可以在 go 中测试这个!

在您的代码中,您可以创建一个方法和等效的函数。我正在一个main.go文件中执行此操作。

type A string
func (a A) Demo(i int) {}
func Demo(a A, i int) {}
Run Code Online (Sandbox Code Playgroud)

然后在测试文件中为其创建一个基准(main_test.go对我来说)。

func BenchmarkMethod(b *testing.B) {
    var a A = "test"
    var i int = 123

    for n := 0; n < b.N; n++ {
        a.Demo(i)
    }
}

func BenchmarkFunction(b *testing.B) {
    var a A = "test"
    var i int = 123

    for n := 0; n < b.N; n++ {
        Demo(a, i)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后测试基准go test -bench=.

BenchmarkMethod-8       2000000000           0.27 ns/op
BenchmarkFunction-8     2000000000           0.29 ns/op
PASS
Run Code Online (Sandbox Code Playgroud)

您可以更新您的方法和函数来执行相同的操作,看看这会如何影响事情。

func (a A) Demo(i int) string {
    return fmt.Sprintf("%s-%d", a, i)
}

func Demo(a A, i int) string {
    return fmt.Sprintf("%s-%d", a, i)
}
Run Code Online (Sandbox Code Playgroud)

测试这个仍然让我获得几乎相同的性能。

$ go test -bench=.
BenchmarkMethod-8       10000000           233 ns/op
BenchmarkFunction-8     10000000           232 ns/op
PASS
Run Code Online (Sandbox Code Playgroud)

如此简短的答案 - 我非常怀疑两者之间是否存在任何显着的性能差异,如果存在的话,看起来您运行的任何其他代码可能比使用方法与函数产生更大的影响。