这次我们来看看固定大小数据集合和动态大小数据集合之间的性能差异
在 Golang 中,您可以使用固定大小的数据集(如数组)以及动态大小的数据集(如切片)。但是你有没有想过当你选择一个而不是另一个时,你的应用程序的性能会如何变化?今天,我们将探索这两种变体,并找出哪个更快以及差异有多大。作为一个小小的偷窥,我已经可以告诉你,结果会让你大吃一惊。所以,我现在停止说话,让我们开始吧!!
介绍
在开始之前,让我们看看现有的不同数据集合。在固定大小的数据集的情况下,有数组。另一方面,我们有地图和切片。简而言之,切片就像具有更通用和更强大的接口且没有固定大小的数组。地图是其他语言中所谓的字典或哈希。只是一个数据集合,其中每条记录都有自己的自定义键。
现在,在我们描述了我们的各种数据收集之后,我们可以制定我们的主要问题。
- 切片与数组!哪个表现更好?
- 切片与地图!使用自定义键会影响性能吗?
切片与数组
为了更深入地比较切片和数组,我为这两种情况创建了基准测试。我们首先为这两种方法运行它们。将结果保存到文件中,最后与 benchstat 进行比较。您可以在下面看到两个基准测试:
阵列基准测试
package datasets
import (
"fmt"
"testing"
)
const arraySize = x // Placeholder for the number of elements
func InsertXArray(itemCount int, b *testing.B) {
var testArray [arraySize]int
for i := 0; i < itemCount; i += 1 {
testArray[i] = i
}
}
func BenchmarkInsertXArray(b *testing.B) {
b.Run(fmt.Sprintf("item_size_%d", arraySize), func(b *testing.B) {
for i := 0; i < b.N; i++ {
InsertXArray(arraySize, b)
}
})
}
切片基准测试
package datasets
import (
"fmt"
"testing"
)
const sliceItemCount = x // Placeholder for the number of elements
func InsertXSlice(itemCount int, b *testing.B) {
testSlice := []int{}
for i := 0; i < itemCount; i += 1 {
testSlice = append(testSlice, i)
}
}
func BenchmarkInsertXSlice(b *testing.B) {
b.Run(fmt.Sprintf("item_size_%d", sliceItemCount), func(b *testing.B) {
for i := 0; i < b.N; i++ {
InsertXSlice(sliceItemCount, b)
}
})
}
我认为这两个代码片段在很大程度上是不言自明的。 您可以看到每个片段的两个函数。 首先,根据我放入函数的数字,我将许多数字附加到我的数组/切片中。 第二个是我的实际基准测试。 在这里,我调用第一个函数并测试用所有数字丰富我们的数组/切片需要多长时间。
比较
接下来,我们想知道哪个性能更高,差异有多大。 为此,我们存储了两个基准测试的结果并将它们与 benchstat 进行比较。
benchstat slice.txt array.txt
结果很有趣。 我已经认为我们使用数组的方法应该比使用切片的方法更快。 但我不知道两个版本之间的性能差距如此之大。 带有数组的版本要快得多,并且差异会随着我们数据集的大小而迅速增加。
带走
我想大多数人已经意识到数组比切片快。 但是我们之前看到的这种效果应该使我们更加注意要使用的类型的选择。 我们的数据集越大,我们的决策产生的影响就越大。
最后的想法
这是“固定与动态大小的数据集合”的第一部分。 我希望数组与切片的比较很有趣,并且你学到了一些新东西。 如果您有什么要提及或有任何疑问,最好将它们留在评论中。 再见。
本文是新系列的一部分。 我将介绍各种通用辅助函数、有趣的基准测试和有用的特性。
如果你和我一样兴奋,请继续关注!
如若转载,请注明出处:https://www.daxuejiayuan.com/45454.html