我为什么要使用指针(性能)?

时间:2015-03-19 21:18:21

标签: pointers go

我想知道原始对象与指向对象的指针是否有任何性能指标。

  • 我知道在引用类型(例如地图)上使用指针是没有意义的,所以请不要提及。
  • 我知道你"必须"如果数据需要更新,请使用指针,所以请不要提及。

我发现的大多数答案/文档基本上都是对官方文档中的指南进行了重新说明: ... If the receiver is large, a big struct for instance, it will be much cheaper to use a pointer receiver.

我的问题仅仅是什么意思"大" /"大"?字符串上的指针是否过度杀伤?怎么样的结构有两个字符串,结构3字符串字段呢?

我认为我们经常处理这个用例,所以这是一个公平的问题。有些人建议不要担心性能问题,但也许有些人想要使用正确的表示法,即使性能提升不具有意义,也要使用正确的表示法。毕竟指针不是那么昂贵(即一次额外击键)。

3 个答案:

答案 0 :(得分:3)

使用指针没有意义的示例是参考类型(slices, maps, and channels

this thread中所述:

  

参考的概念仅仅意味着引用某些东西的目的。这不是神奇的。

     

指针是一个简单的参考,告诉你在哪里看   切片告诉您从哪里开始查看以及距离   地图和渠道也会告诉您在哪里查看,但他们引用的数据及其支持的操作更为复杂。

     

重点是所有实际数据都是间接存储的,而您所持有的只是有关如何访问它的信息   因此,在许多情况下,您不需要添加另一个间接层,除非您出于某种原因需要双重间接。

作为“twotwotwo”中的Pointers vs. values in parameters and return values详细信息,字符串,接口值和函数值也通过指针实现。
因此,您很少需要在这些对象上使用指针。

答案 1 :(得分:1)

引用官方golang documentation

  

......效率的考虑。如果接收器很大,例如一个大的结构,使用指针接收器会便宜得多。

答案 2 :(得分:0)

很难给出确切的条件,因为可以有不同的性能目标。根据经验,默认情况下,所有大于128位的对象都应该通过指针传递。规则的可能例外:

  • 您正在编写对延迟敏感的服务器,因此您希望最大限度地减少垃圾回收压力。为了实现你的Request结构有byte [8]字段而不是指向Data struct的指针,它保存了byte [8]。一个分配而不是两个。

      当您传递结构并进行复制时,
    • 您编写的算法更具可读性