在C#中,我想知道使用代码referencing a List
变量与copying all the values
的性能差异
new List<>(otherlist)
我有一个线程,我在其中持有少量MySQL查询List<MySqlCommand>
,并且还有一个SELECT
查询,需要每隔30秒执行一次。
当线程正在运行时,此List<MySqlCommand>
将从其他代码更新。
为此,我编写了一个锁码,将List
中的值复制到本地List
,如下所示protected override void ThreadFunction()
Mutex lock= new Mutex();
.....
.....
lock.WaitOne();
List<MySqlCommand> currentSql = sqlHistory;
sqlHistory = new List<MySqlCommand>();
lock.ReleaseMutex();
我觉得每30秒我就会创建一个新的对象实例
我的问题是,如果我们这样做会怎么样
Mutex lock= new Mutex();
.....
.....
lock.WaitOne();
List<MySqlCommand> currentSql = new List<MySqlCommand>(sqlHistory);
sqlHistory.Clear();
lock.ReleaseMutex();
复制是否会降低性能或内存泄漏。哪一个会更好。
答案 0 :(得分:0)
我认为没有最好的&#39;或者最快的方式,每30秒执行一次。两者都不泄漏。但对于逻辑;创建新列表并复制项目听起来很愚蠢。
您应该选择最易读的方式。但是,我宁愿使用lock
,因为它使用了try / finally。每当抛出异常时,您需要确保释放锁定。
我主要使用这种结构进行批处理:
MySqlCommand[] copy;
lock(_sqlHistory)
{
copy = _sqlHistory.ToArray();
_sqlHistory.Clear();
}
foreach(var command in copy)
{
// ...
}
接下来的问题,为什么每30秒执行一次尖峰会产生尖峰?