去地图vs C#字典

Rob*_*Rob 4 c# performance go

我写了一个快速而肮脏的测试来检查Go vs C#在并发查找访问方面的性能,并对结果感到惊讶.

这是一个非常简单的例子,我不是专家,但测试只是在地图上执行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)
}
Run Code Online (Sandbox Code Playgroud)

在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();
}
Run Code Online (Sandbox Code Playgroud)

我总结了两个集合的元素,以确保它们匹配(499,999,500,000)并打印所花费的时间.结果如下:

  • C#:56ms
  • 去:327ms

我已经检查过,无法初始化地图的大小,只有容量,所以我想知道是否有什么可以改善Go地图的性能?

没有地图访问权限需要Go 32ms来执行1,000,000次锁定/解锁操作.

Vol*_*ker 5

[S] o我想知道是否有什么可以改善Go地图的性能?

不,那里没有.Go基本上没有性能旋钮.

(注意,Go的map类型是一个非常通用且强大的哈希映射,它使用强加密哈希(如果可能的话)来防止攻击并强制随机键/迭代顺序.它是"完全通用的"而不仅仅是"快速字典".)

只是为了完全正确:有一个环境变量GOGC来"调整"GC.

  • 好吧,如果 Go 的 `map` 使用加密哈希,那可能就是性能瓶颈。对于问题“http://stackoverflow.com/questions/3893782/how-is-gethashcode-implemented-for-int32”的[答案](http://stackoverflow.com/a/3893790/467473), `int` 值的 .Net 哈希是对象引用本身:`public override int GetHashCode() { return this; } }`。很难想出更快的哈希函数。 (2认同)