我写了一个快速而肮脏的测试来检查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)并打印所花费的时间.结果如下:
我已经检查过,无法初始化地图的大小,只有容量,所以我想知道是否有什么可以改善Go地图的性能?
没有地图访问权限需要Go 32ms来执行1,000,000次锁定/解锁操作.
[S] o我想知道是否有什么可以改善Go地图的性能?
不,那里没有.Go基本上没有性能旋钮.
(注意,Go的map类型是一个非常通用且强大的哈希映射,它使用强加密哈希(如果可能的话)来防止攻击并强制随机键/迭代顺序.它是"完全通用的"而不仅仅是"快速字典".)
只是为了完全正确:有一个环境变量GOGC来"调整"GC.
| 归档时间: |
|
| 查看次数: |
4206 次 |
| 最近记录: |