我正在维护一个Go项目的代码,该项目可以读写大量数据,并且已经成功完成了一段时间。最近,我进行了更改:在程序开始时,将具有约200万条记录的CSV文件加载到具有结构值的映射中。该映射仅在B部分中使用,但首先执行A部分。并且第一部分的运行速度明显比以前慢(处理时间翻了两番)。这很奇怪,因为这部分逻辑没有改变。 我花了一个星期的时间来解释这种情况如何发生。这是我已采取的步骤(当提到性能时,我总是指A部分,该部分不包括将数据加载到内存中的时间,而实际上与它无关):
什么可能导致这种影响?如何找到?
答案 0 :(得分:1)
因此,如果我做对了,您的流程将如下所示:
为什么要在需要之前读取数据,这将是第一个问题,但这也许不是重点。
实际上,垃圾回收器通常会定期访问一个映射中的200万个结构。取决于GOGC
的值,随着分配的内存量的增加,垃圾收集器的步调器组件可能更频繁地加入。由于将此映射留作以后使用,因此GC无需执行任何操作,但是无论如何都要花很多时间检查数据。您可以做很多事情来验证并解释这种行为-所有这些事情都可以帮助您排除/确认垃圾收集是否会使您的速度下降。
debug.SetGCPercent(-1)
)sync.Pool
中。这是一种为您设计的类型,用于保留您将要手动管理的内容,并移出常规的GC周期。