Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 为什么要使用指针(性能)?_Pointers_Go - Fatal编程技术网

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

Pointers 为什么要使用指针(性能)?,pointers,go,Pointers,Go,我想知道在原始对象和指向对象的指针上是否有性能基准 我知道在引用类型(例如映射)上使用指针是没有意义的,所以请不要提及 我知道如果数据需要更新,您“必须”使用指针,所以请不要提及 我发现的大多数答案/文件基本上都是对官方文件中的指南进行了重新表述: 。。。如果接收器很大,例如一个大结构,使用指针接收器会便宜得多。 我的问题很简单,“大”/“大”是什么意思?字符串上的指针是否过量?有两个字符串的结构怎么样,有三个字符串字段的结构怎么样 我认为我们经常处理这个用例,所以这是一个公平的问题。有些人

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

  • 我知道在引用类型(例如映射)上使用指针是没有意义的,所以请不要提及
  • 我知道如果数据需要更新,您“必须”使用指针,所以请不要提及
我发现的大多数答案/文件基本上都是对官方文件中的指南进行了重新表述:
。。。如果接收器很大,例如一个大结构,使用指针接收器会便宜得多。

我的问题很简单,“大”/“大”是什么意思?字符串上的指针是否过量?有两个字符串的结构怎么样,有三个字符串字段的结构怎么样

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

引用官方的话

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


使用指针没有意义的示例是引用类型()

如中所述:

引用的概念只是指为你引用某个东西的目的服务的东西。这并不神奇

指针是一个简单的引用,它告诉您要查找的位置。
切片告诉您从何处开始查看以及查看的距离。
地图和频道也只是告诉你去哪里看,但是它们引用的数据和支持的操作更复杂

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

如“”中所述,字符串、接口值和函数值也使用指针实现。

因此,您几乎不需要在这些对象上使用指针。

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

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

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

等等。

我写了很多关于何时使用/不使用指针的文章。在你知道你正在处理的代码是你的瓶颈之前,不要担心性能;要知道它什么时候有用或有害,您可能真的需要在实际代码上进行实验,以考虑缓存效应等。问题实际上只是性能问题,而不是其他用例。我还更新了问题,以澄清这与何时使用指针无关。经验法则:在另一个答案中,我注意到stdlib有一个函数,可以将10个字的数据推送到堆栈上,因此您可以将其视为上限,您倾向于使用指针。我绝对不会使用指向两个字符串(四个单词)的指针。如果性能真的很重要,我会开始测量大约三个字符串(六个单词)。通常情况下,这并不重要。经验法则,甚至是仔细的分析,也不能总是预测什么性能最好——如果这很关键的话,你只需要对你的应用程序进行基准测试。指针和值有很多不同的影响(对复制量、内存位置、GC时间、分配数量等),因此您可能需要测量它们在您的情况下如何平衡。字符串、接口值和函数值也使用指针实现。关于它有很多。我应该从这个答案中理解,对于任何不是引用类型的东西,我应该使用指针吗?i、 e.一个字符串。@UserWith不表示对于任何非引用类型的对象,都可以使用指针。这并不意味着你必须这样做,但这主要在传递大型结构时是有意义的。@TheUsers没有“也许有些人在有机会的时候想做正确的事情,即使性能提升并不显著”:这被称为,并且有很好的文档记录:不要担心太快,这就是为什么go附带了一个基准测试框架()@VonC我想知道使用不同的整数类型是否也被认为是过早的优化。