【问题标题】:Why should I use a pointer ( performance)?为什么要使用指针(性能)?
【发布时间】:2015-03-19 21:18:20
【问题描述】:

我想知道是否有针对原始对象和指向对象的指针的性能基准测试。

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

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

我的问题只是“大”/“大”是什么意思?字符串上的指针是否矫枉过正?带有两个字符串的结构怎么样,结构 3 字符串字段怎么样?

我认为我们经常处理这个用例,所以这是一个公平的问题。有些人建议不要介意性能问题,但也许有些人希望在有机会时使用正确的符号,即使性能增益并不显着。毕竟指针并不那么昂贵(即一个额外的按键)。

【问题讨论】:

  • 我写了很多关于何时使用/不使用指针over here。在您知道自己正在处理成为瓶颈的代码之前,不要担心性能;要知道它何时会有所帮助或有害,您可能必须对实际代码进行试验,以考虑缓存效果等。
  • 这个问题实际上只是关于性能问题而不是其他用例。
  • 我还更新了问题以澄清这与何时使用指针无关。
  • 经验法则:在另一个答案中,我注意到 stdlib 有一个函数可以将 10 个字的数据推送到堆栈上,所以也许您可以将其视为您倾向于过去的上限使用指针。我绝对不会使用指向两个字符串(四个字)的指针。如果性能真的很重要,我会开始测量大约三个字符串(六个单词)。这通常并不重要。
  • 经验法则,甚至仔细分析,并不总是能预测出什么表现最好——如果这很关键,你只需要对你的应用程序进行基准测试。指针与值有很多不同的影响(关于复制量、内存位置、GC 时间、分配次数等),因此您可能需要测量它们在您的情况下如何平衡。

标签: pointers go


【解决方案1】:

使用指针没有意义的一个例子是引用类型 (slices, maps, and channels)

this thread中所述:

引用的概念只是指为了向您推荐某物而服务的东西。这并不神奇。

指针是一个简单的引用,它告诉您在哪里查找。
切片告诉您从哪里开始寻找以及多远。
地图和频道也只是告诉您在哪里查看,但它们引用的数据和它们支持的操作更加复杂。

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

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

【讨论】:

  • 字符串、接口值和函数值也是用指针实现的。有很多关于它的over here
  • 我应该从这个答案中了解到,对于任何不是引用类型的东西,我应该使用指针吗?即一个字符串。
  • @Theuserwithnohat 对于任何不是引用类型的东西,您可以使用指针。这并不意味着您必须这样做,但主要是在绕过大型结构时才有意义。
  • @Theuserwithnohat “也许有些人只要有机会就想做正确的事,即使性能提升并不显着”:这就是所谓的c2.com/cgi/wiki?PrematureOptimization 并且有据可查:别担心太快了,这就是为什么 Go 自带基准测试框架 (dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go)
  • @VonC 我想知道使用不同的整数类型是否也被认为是过早的优化。
【解决方案2】:

引用官方golang documentation

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

【讨论】:

    【解决方案3】:

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

    • 您正在编写对延迟敏感的服务器,因此您希望最大程度地减少垃圾收集压力。为了实现您的请求结构具有字节 [8] 字段而不是指向包含字节 [8] 的数据结构的指针。一个分配而不是两个。

      • 当您传递结构并制作副本时,您正在编写的算法更具可读性

    等等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多