【问题标题】:Do I have to avoid appending for performance?我是否必须避免附加性能?
【发布时间】:2014-06-15 01:35:03
【问题描述】:

我是 Golang 的新手。
我应该始终避免appending 切片吗?

我需要在内存中加载一个换行符分隔的数据文件。 考虑到性能,我应该计算行数,然后将所有数据加载到预定义的长度数组中,还是可以只将行附加到切片?

【问题讨论】:

  • go 附带了很好的分析工具。您会看到附加已经足够好,因此它通常是最快的解决方案。

标签: arrays performance go slice


【解决方案1】:

您应该停止考虑性能并开始衡量应用程序的实际瓶颈是什么。

对于诸如“由于性能而应该做/避免 X”之类的问题有什么建议吗?在 50% 的情况下是无用的,在 25% 的情况下会适得其反。

有一些非常一般的建议,例如“不要不必要地产生垃圾”,但您的问题无法回答,因为这在很大程度上取决于您的文件大小:

  • 您的文件是 ~ 3 Tera 字节?很可能无论如何您都必须逐行阅读...
  • 您的文件只有一堆(约 50 行)行:可能首先计算行数比重新分配 []string 切片 4 次(或者最初是您 make([]string,0,100) 的 0 次)要多。 string 只是两个字。
  • 您的文件有一个未知但很大 (>10k) 行:也许值得。 “也许”是指您应该根据真实数据进行衡量。
  • 已知您的文件很大(> 500k 行):肯定首先计数,但您可能会从第一个要点开始遇到问题。

你看:关于性能的一般建议是一个糟糕的建议,所以我不会给出。

【讨论】:

  • 另外,append super sekretly 将小数组的底层数组大小加倍,当底层内存用完时,将大数组的大小乘以大约 1.5 倍,所以它不像每次都调用 realloc。跨度>
  • Jsor 的评论应该包含在答案中,因为它一般的。 append 不是 O(n),而是摊销 O(1),这意味着几乎没有理由避免它。
  • 啊该死的。这是特定于实现的,不是规范的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2016-03-14
  • 2019-10-13
  • 2015-10-26
相关资源
最近更新 更多