英文:
Do I have to avoid appending for performance?
问题
我是新手学习 Golang。
我应该总是避免使用 append
来添加切片吗?
我需要将一个以换行符分隔的数据文件加载到内存中。
考虑到性能,我应该先计算行数,然后将所有数据加载到预定义长度的数组中,还是可以直接将行添加到切片中?
英文:
I am new to Golang.
Should I always avoid append
ing slices?
I need to load a linebreak-separated data file in memory.
With performance in mind, should I count lines, then load all the data in a predefined length array, or can I just append lines to a slice?
答案1
得分: 11
你应该停止考虑性能问题,开始测量你的应用程序的实际瓶颈是什么。
对于像“因为性能问题,应该做/避免X吗?”这样的问题,50%的情况下给出的建议是无用的,25%的情况下是适得其反的。
有一些非常通用的建议,比如“不要不必要地生成垃圾”,但是你的问题无法回答,因为这在很大程度上取决于你的文件大小:
- 你的文件大小约为3TB?很可能你无论如何都需要逐行读取它...
- 你的文件只有一堆(约50行):可能首先计算行数比重新分配
[]string
切片4次(或者初始时使用make([]string,0,100)
)更费力。一个string
只占用2个字。 - 你的文件有一个未知但很大(>10k)的行数:也许值得尝试。“也许”是指你应该在真实数据上进行测量。
- 你的文件已知很大(>500k行):肯定首先计算行数,但你可能会从第一个问题点开始遇到问题。
你看:关于性能的通用建议是一个糟糕的建议,所以我不会给出一个。
英文:
You should stop thinking about performance and start measuring what the actual bottleneck of you application is.
Any advice to a question like "Should do/avoid X because of performance?" is useless in 50% of the cases and counterproductive in 25%.
There are a few really general advices like "do not needlessly generate garbage" but your question cannot be answered as this depends a lot on the size of your file:
- Your file is ~ 3 Tera byte? Most probably you will have to read it line by line anyway...
- Your file has just a bunch (~50) of lines: Probably counting lines first is more work than reallocating a
[]string
slice 4 times (or 0 times you youmake([]string,0,100)
it initially). Astring
is just 2 words. - Your file has an unknown but large (>10k) lines: Maybe it might be worth. "Maybe" in the sense you should measure on real data.
- Your file is known to be big (>500k lines): Definitively count first, but you might start hitting the problem from the first bullet point.
You see: A general advice for performance is a bad advice so I won't give one.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论