c\#반사 용법 및 효율 대비
public class Person
{
public string Name { get; set; }
public Person(string name)
{
this.Name = name;
}
public string Say(string msg)
{
return $"{Name}: {msg}";
}
}
class Program
{
//
const int count = 10000000;
static void Main(string[] args)
{
CreateInstance0();
CreateInstance1();
CreateInstance2();
CreateInstance3();
CreateInstance4();
Console.Read();
}
static void CreateInstance0()
{
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
Person person = new Person(" ");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - new");
}
static void CreateInstance1()
{
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
object person = Activator.CreateInstance(typeof(Person), " ");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - Activator.CreateInstance");
}
static void CreateInstance2()
{
Assembly assembly = Assembly.GetExecutingAssembly();
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
Person obj = (Person)assembly.CreateInstance("ConsoleTest.Person", true, BindingFlags.Default, null, new object[] { " " }, null, null);
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance");
}
static void CreateInstance3()
{
Assembly assembly = Assembly.GetExecutingAssembly();
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
Type type = assembly.GetType("ConsoleTest.Person");
object person = Activator.CreateInstance(type, " ");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance1");
}
static void CreateInstance4()
{
Assembly assembly = Assembly.GetExecutingAssembly();
Stopwatch watch = new Stopwatch();
watch.Start();
Type type = assembly.GetType("ConsoleTest.Person");
for (var i = 0; i < count; i++)
{
object person = Activator.CreateInstance(type, " ");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance2");
}
}
class Program
{
//
const int count = 10000000;
static void Main(string[] args)
{
InvokeMethod0();
InvokeMethod1();
InvokeMethod2();
InvokeMethod3();
InvokeMethod4();
Console.Read();
}
static void InvokeMethod0()
{
Person person = new Person(" ");
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
string name = person.Say("Hello World!");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - ");
}
static void InvokeMethod1()
{
Person person = (Person)Activator.CreateInstance(typeof(Person), " ");
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
string name = person.Say("Hello World!");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - ");
}
static void InvokeMethod2()
{
Person person = (Person)Activator.CreateInstance(typeof(Person), " ");
MethodInfo method = typeof(Person).GetMethod(nameof(Person.Say), new Type[] { typeof(string) });
Func<string, string> func = (Func<string, string>)method.CreateDelegate(typeof(Func<string, string>), person);
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
string result = func("Hello World!");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - ");
}
static void InvokeMethod3()
{
Person person = (Person)Activator.CreateInstance(typeof(Person), " ");
MethodInfo method = typeof(Person).GetMethod(nameof(Person.Say), new Type[] { typeof(string) });
object[] parameters = new object[] { "Hello World!" };
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
string name = (string)method.Invoke(person, parameters);
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - ");
}
static void InvokeMethod4()
{
Person person = (Person)Activator.CreateInstance(typeof(Person), " ");
object[] parameters = new object[] { "Hello World!" };
Stopwatch watch = new Stopwatch();
watch.Start();
for (var i = 0; i < count; i++)
{
string result = (string)(typeof(Person).GetMethod(nameof(Person.Say))?.Invoke(person, parameters));
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - ");
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.