【发布时间】: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 时间、分配次数等),因此您可能需要测量它们在您的情况下如何平衡。