반응형
//spin lock
public void Add(T item)
{
bool locked = false;
_spinLock.Enter(ref locked);
_vector.Add(item);
_spinLock.Exit();
}
//lock
public void Add(T item)
{
lock(this.SyncRoot)
{
_vector.Add(item);
}
}
사용가능한 쓰레드를 모두 사용했을때 결과
lock을 사용한 결과 2.310, 1.876 ms
spin lock을 사용한 결과 47.241 ms, 62.261ms
public class Benchmark
{
[Benchmark]
public void ThreadSpinLock()
{
Kosher.Collections.SynchronizedVector2<int> synchronizedVector = new SynchronizedVector2<int>(10000);
Parallel.For(0, 10000, (i) =>
{
synchronizedVector.Add(i);
});
}
[Benchmark]
public void ThreadLock()
{
Kosher.Collections.SynchronizedVector<int> synchronizedVector = new SynchronizedVector<int>(10000);
Parallel.For(0, 10000, (i) =>
{
synchronizedVector.Add(i);
});
}
}
쓰레드의 경합이 많아질수록 SpinLock의 처리속도는 늦어진다.
public class Benchmark
{
[Benchmark]
public void ThreadSpinLock()
{
Kosher.Collections.SynchronizedVector2<int> synchronizedVector = new SynchronizedVector2<int>(10000);
var option = new ParallelOptions();
option.MaxDegreeOfParallelism = 2;
Parallel.For(0, 10000, option, (i) =>
{
synchronizedVector.Add(i);
});
}
[Benchmark]
public void ThreadLock()
{
var option = new ParallelOptions();
option.MaxDegreeOfParallelism = 2;
Kosher.Collections.SynchronizedVector<int> synchronizedVector = new SynchronizedVector<int>(10000);
Parallel.For(0, 10000, (i) =>
{
synchronizedVector.Add(i);
});
}
}
다만 쓰레드의 경합이 없는 경우 Thread Context Switching 이 없기에 Spin Lock의 속도가 더 잘나온다.
반응형
'개발관련 > C#' 카테고리의 다른 글
리플렉션(Reflection)과 표현식 트리(Expression Tree) (0) | 2023.10.15 |
---|---|
System.IO.Pipelines (0) | 2023.02.08 |
.net core 패킷 데이터가 30K 바이트보다 큰 경우 디스크에 저장 (0) | 2022.04.06 |
소켓 비정상 종료 처리 TcpKeepAlive (0) | 2018.09.13 |
C++/CLI를 통한 C++ 클래스 마샬링 (0) | 2018.08.11 |