StackTrace
및 CallerInfo Attributes
을 사용하여 성능을 벤치 마크했습니다.호출자 메서드 이름 가져 오기 - Reflection 및 CallerInfo 특성
놀랍게도 나는 을 사용하는 것이 훨씬 빠르다는 것을 발견했다.
public class Program
{
public static void Main(string[] args)
{
Method1();
}
static void Method1([CallerMemberName]string memberName = "")
{
double stackTraceTimings = 0;
var sw = new Stopwatch();
foreach(var item in Enumerable.Range(1,1000).ToList())
{
sw.Start();
var callerName = new StackFrame(1).GetMethod().Name;
sw.Stop();
stackTraceTimings += sw.Elapsed.TotalMilliseconds;
}
Console.WriteLine("Elapsed Time for retrieving the caller name using StackFrame in 1000 iterations ={0}",stackTraceTimings/1000);
stackTraceTimings = 0;
foreach(var item in Enumerable.Range(1,1000).ToList())
{
sw.Start();
var callerName = (memberName);
sw.Stop();
stackTraceTimings += sw.Elapsed.TotalMilliseconds;
}
Console.WriteLine("Elapsed Time for retrieving the caller name using callerInfo Attribute in 1000 iterations ={0}",stackTraceTimings/1000);
}
OUTPUT : 1000 번의 반복 callerInfo 특성을 이용하여 발신자의 이름을 검색 1000 반복에 StackFrame을를 이용하여 발신자의 이름을 검색하기위한 경과 시간 = 9.48074760000001
경과 시간 = 21.7074064
내가 잘못 이해 했습니까? 선호하는 접근 방식은 CallerInfo
속성을 사용하는 것입니까?
지적 해 주신 답변에 감사드립니다.
루프에서 매번 타이머를 다시 시작해야합니다.
누가이기는가요? 아래 답변은 CallerInfo
입니다. 왜냐하면 컴파일 타임 기능이기 때문에 더 빠릅니다.
경과 시간 = 1000의 반복에 callerInfo 속성을 사용하여 호출자 이름을 입수 0.00639420000000002
I 1000 반복에 StackFrame을를 이용하여 발신자의 이름 = 0.00762619999999992
경과 시간을 검색하기위한 아래의 코드 (개정)를 사용하고 위의 결과를 얻었습니다.
public class Program
{
public static void Main(string[] args)
{
Method1();
}
static void Method1([CallerMemberName]string memberName = "")
{
double stackTraceTimings = 0;
var sw = new Stopwatch();
foreach(var item in Enumerable.Range(1,1000).ToList())
{
sw.Start();
var callerName = new StackFrame(1).GetMethod().Name;
sw.Stop();
Console.Write(callerName);
sw.Restart();
stackTraceTimings += sw.Elapsed.TotalMilliseconds;
}
Console.WriteLine("Elapsed Time for retrieving the caller name using StackFrame in 1000 iterations ={0}",stackTraceTimings/1000);
stackTraceTimings = 0;
foreach(var item in Enumerable.Range(1,1000).ToList())
{
sw.Start();
var callerName = (memberName);
Console.Write(callerName);
sw.Stop();
sw.Restart();
stackTraceTimings += sw.Elapsed.TotalMilliseconds;
}
Console.WriteLine("Elapsed Time for retrieving the caller name using callerInfo Attribute in 1000 iterations ={0}",stackTraceTimings/1000);
}
}
CallerMemberNameAttribute "callerInfo"를 호출하고 있습니까? 혼란스러워. – Will