我正在尝试重构我的项目,现在我正在尝试寻找提高应用程序性能的最佳方法。
问题 1. SpinLock vs Interlocked
要创建计数器,哪种方式性能更好。
Interlocked.increament(ref counter)
或者
SpinLock _spinlock = new SpinLock()
bool lockTaken = false;
try
{
_spinlock.Enter(ref lockTaken);
counter = counter + 1;
}
finally
{
if (lockTaken) _spinlock.Exit(false);
}
如果我们需要增加另一个计数器,比如counter2
,我们应该声明另一个SpinLock
对象吗?还是足以使用另一个boolean
对象?
问题2.处理嵌套任务或更好的替换
在我的应用程序的当前版本中,我使用了任务,将每个新任务添加到数组中,然后使用Task.WaitAll()
经过大量研究,我发现 usingParallel.ForEach
具有更好的性能,但是如何控制当前线程的数量?我知道我可以MaxDegreeOfParallelism
在ParallelOptions
参数中指定a,但问题出在这里,每次crawl(url)
方法运行时,它只会创建另一个有限数量的线程,我的意思是如果我设置MaxDegree
为10,每次crawl(url)
运行,都会创建另一个+10,是吗?对吧?,那我该如何防止呢?我应该使用信号量和线程而不是并行吗?还是有更好的方法?
public void Start() {
Parallel.Invoke(() => { crawl(url) } );
}
crawl(string url) {
var response = getresponse(url);
Parallel.foreach(response.links, ParallelOption, link => {
crawl(link);
});
}
问题 3. 当所有作业(和嵌套作业)完成时通知。
我的最后一个问题是,我如何才能了解我的所有工作何时完成?