指针与值参数和接收器权衡

时间:2016-01-09 22:42:11

标签: go micro-optimization

我来自C ++世界,有像移动语义和RVO这样的东西。 既然如此,我想知道在按值传递参数时是否存在任何权衡?

在我的情况下,我有相当大的结构,我需要传递给一堆函数。据我所知,每次将值传递给函数时,都会创建一个副本。传递指针而不是值更好吗?

我看到唯一的权衡是原始对象可能会被意外或无意地更改,而且调用者不清楚传递的参数是否应该被修改。

如果传递的值未被修改,是否有优化?

1 个答案:

答案 0 :(得分:3)

对此没有优化,一切都将被复制。它归结为被复制的不同字段的数量(即如果你有一个结构的成员,当然它的字段数也很重要)。

因此,如果你有非常复杂的结构,并且性能如此重要以至于这可能成为瓶颈,那么你应该使用指针甚至是不可变的东西。

我编写了一个基准测试程序,该基准程序调用一个方法,该方法在具有15个字段的结构上不起作用。一种方法是指针,另一种方法是值方法。结果:

BenchmarkValue  100000000           12.1 ns/op
BenchmarkPointer    2000000000           0.42 ns/op