C\#실례 화 대상 의 세 가지 방식 과 성능 대 비 를 상세히 설명 하 다
프로젝트 를 하 는 과정 에서 2 만 개의 대상 을 실례 화하 고 List 에 추가 해 야 하 는 수요 가 있 습 니 다.
이 과정 에서 약 1min 이 걸 려 야 불 러 올 수 있 습 니 다.(전 참 이 많 습 니 다)그래서 코드 최적화 여행 을 시 작 했 습 니 다.그리고 이 기록 을 기록 합 니 다.
먼저 생각 나 는 것 은 실례 화가 비교적 오래 걸 릴 수 있다 는 것 이다.그래서 모든 실례 화 방식 을 테스트 하기 시작 했다.과정 은 다음 과 같다.
실례 화 방식
1.New 키워드 로 클래스 를 예화 합 니 다.
2.Activator 로 클래스 를 예화 합 니 다.
3.Assembly 로 하나의 종 류 를 예화 한다.
코드 구현
테스트 환경:
vs2019 .NET Framework 4.7
Intel Core i7-10510U CPU
우선 클래스 Person 을 정의 합 니 다.
public class Person
{
public Person()
{
}
public Person(string name)
{
Name = name;
}
public string Name { get; set; }
}
우 리 는 먼저 인삼 이 없 는 구조 함수 에서 예화 하고 모든 방식 으로 10 번 을 진행 하 며 매번 10 만 번 을 예화 하 며 코드 는 다음 과 같다.
static void Main(string[] args)
{
Console.WriteLine(" ( : )");
Console.Write(" ");
for (int i = 1; i <= 10; i++)
Console.Write("{0:G}", i.ToString().PadLeft(5));
Console.Write("
");
Console.Write("InstanceByNew".PadRight(20));
for (int i = 1; i <= 10; i++)
{
Person person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int j = 0; j < 100000; j++)
person = new Person();
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
Console.Write("
");
Console.Write("InstanceByActivator".PadRight(20));
for (int i = 1; i <= 10; i++)
{
Type type = Type.GetType("ConsoleApp1.Person");
Person person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int j = 0; j < 100000; j++)
{
object obj = Activator.CreateInstance(type);
person = obj as Person;
}
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
Console.Write("
");
Console.Write("InstanceByAssembly".PadRight(20));
for (int i = 1; i <= 10; i++)
{
Assembly assembly = Assembly.Load("InstancePerformance");
Person person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int j = 0; j < 100000; j++)
{
object obj = assembly.CreateInstance("ConsoleApp1.Person");
person = obj as Person;
}
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
Console.Write("
");
Console.ReadKey();
}
실행 결 과 는 다음 과 같 습 니 다.그리고 삼 구조 함수 에서 실례 화 된 코드 와 결 과 를 살 펴 보 겠 습 니 다.
static void Main(string[] args)
{
Console.WriteLine(" ( : )");
Console.Write(" ");
for (int i = 1; i <= 10; i++)
Console.Write("{0:G}", i.ToString().PadLeft(5));
Console.Write("
");
Console.Write("InstanceByNew".PadRight(20));
for (int i = 1; i <= 10; i++)
{
Person person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int j = 0; j < 100000; j++)
person = new Person("Test"+j);
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
Console.Write("
");
Console.Write("InstanceByActivator".PadRight(20));
for (int i = 1; i <= 10; i++)
{
Type type = Type.GetType("ConsoleApp1.Person");
Person person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int j = 0; j < 100000; j++)
{
object obj = Activator.CreateInstance(type,new object[]{"Test"+j});
person = obj as Person;
}
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
Console.Write("
");
Console.Write("InstanceByAssembly".PadRight(20));
for (int i = 1; i <= 10; i++)
{
Assembly assembly = Assembly.Load("InstancePerformance");
Person person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int j = 0; j < 100000; j++)
{
object obj = assembly.CreateInstance("ConsoleApp1.Person", true, System.Reflection.BindingFlags.Default, null, new []{"Test"+j}, null, null);
person = obj as Person;
}
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
Console.Write("
");
Console.ReadKey();
}
실행 결 과 는 다음 과 같 습 니 다.결론.
위의 실행 결 과 를 통 해 알 수 있 듯 이 이 세 가지 방식 의 성능 순 서 는?
New > Activator > Assembly
그러나 어떤 방법 을 사용 할 지 는 상황 에 따라 결정 해 야 한다.후속
이상 에서 알 수 있 듯 이 New 성능 이 가장 높 고 저 는 New 를 사 용 했 습 니 다.문 제 는 해결 되 지 않 았 습 니 다.문 제 를 List 에 어떤 요소 가 존재 하 는 지 판단 하 는 것 을 가리 키 고 List 중의 Contains,Exists,Any,Where 를 테스트 하기 시 작 했 습 니 다자세 한 내용 은 클릭 하 세 요.
C\#실례 화 대상 의 세 가지 방식 과 성능 대비 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#실례 화 대상 의 세 가지 방식 과 성능 대비 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많이 지 켜 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.