我写了一个快速而肮脏的测试来检查 Go 与 C# 在并发查找访问方面的性能,结果令我感到惊讶。
这是一个非常简单的例子,我不是 Go 专家,但测试只是在地图上执行 1,000,000 次锁定/检查/添加/解锁操作,它只是单线程的,因为我只检查这些功能:
package main
import (
"fmt"
"sync"
"time"
)
var mu sync.Mutex
func main() {
cache := make(map[int]int, 1000000)
start := time.Now()
for i := 0; i < 1000000; i++ {
mu.Lock()
if _, ok := cache[i]; ok == false {
cache[i] = i
}
mu.Unlock()
}
end := time.Since(start)
fmt.Println(end)
var sum int64
for _, v := range cache {
sum += int64(v)
}
fmt.Println(sum)
}
在 C# 中也是同样的事情(通过 LINQPad):
void Main()
{
var cache = new Dictionary<int, int>(1000000);
var sw = Stopwatch.StartNew();
for (var i = 0; i < 1000000; i++)
{
lock (cache)
{
int d;
if (cache.TryGetValue(i, out d) == false)
{
cache.Add(i, i);
}
}
}
$"{sw.ElapsedMilliseconds:N0}ms".Dump();
var sum = 0L;
foreach (var kvp in cache)
{
sum += kvp.Value;
}
sum.Dump();
}
我将两个集合的元素相加以确保它们匹配 (499,999,500,000) 并打印花费的时间。结果如下:
C#:56 毫秒
运行时间:327 毫秒
我已经检查过无法初始化地图的大小,只能初始化容量,所以我想知道我是否可以做些什么来提高 Go 地图的性能?
在没有地图访问权限的情况下,Go 执行 1,000,000 次锁定/解锁操作需要 32 毫秒。
喵喵时光机
蛊毒传说
料青山看我应如是
相关分类