c# - ConcurrentBag<T> 和 lock(List<T>) 添加或删除哪个更快?

标签 c# .net concurrency

我需要对 List<T> 执行一些线程安全操作.通常我只是简单地使用:

lock(List<T>)
{
   List<T>.Add();
   List<T>.Remove();
}

我知道还有另一种方法,使用 ConcurrentBag<T> .但我不知道哪个更快,或者有什么其他区别。

编辑:

有些人只是推荐我使用ConcurrentBag ,因为这样更安全。但我担心这会使我的操作变慢。

我有很多线程需要在 List<T> 中添加或删除对象, 我想知道哪种方式对性能更好。

最佳答案

您只需尝试一下,即可轻松衡量不同方法的性能!这就是我刚刚得到的:

lock list: 2.162s
ConcurrentBag: 7.264s
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

public class Test
{
    public const int NumOfTasks = 4;
    public const int Cycles = 1000 * 1000 * 4;

    public static void Main()
    {
        var list = new List<int>();
        var bag = new ConcurrentBag<int>();

        Profile("lock list", () => { lock (list) list.Add(1); });
        Profile("ConcurrentBag", () => bag.Add(1));
    }

    public static void Profile(string label, Action work)
    {
        var s = new Stopwatch();
        s.Start();

        List<Task> tasks = new List<Task>();

        for (int i = 0; i < NumOfTasks; ++i)
        {
            tasks.Add(Task.Factory.StartNew(() =>
            {
                for (int j = 0; j < Cycles; ++j)
                {
                    work();
                }
            }));
        }

        Task.WaitAll(tasks.ToArray());

        Console.WriteLine(string.Format("{0}: {1:F3}s", label, s.Elapsed.TotalSeconds));
    }
}

关于c# - ConcurrentBag<T> 和 lock(List<T>) 添加或删除哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29307035/

相关文章:

c# - 异步/等待返回调用链如何工作?

c# - 什么时候使用 extern 关键字而不使用 [DllImport] 属性是合适的?

java - 法线贴图上的双重锁定 - 这安全吗?

java - 如何避免数据库锁

c# - 如何在 C# 中将语法(规则)和听写(自由言论)与 SpeechRecognizer 混合使用

c# - 在字符串 C# 中查找数组元素

c# - 由调试器引起时命中断点

c# - .NET/C# 检查 SQL 查询是否修改数据库,如果不执行

.net - 如何使用c++查找系统中是否安装了.NET?

java - 对 ReentrantReadWriteLock#tryLock 失败的 jcstress 测试感到困惑