c\#코드 의 다섯 가지 기술 개선(2)
데이터 형식 을 사용 하기 전에 선택 하 십시오.
많은 유형 에 대해 우 리 는 일상생활 에서 어떤 데이터 유형 을 사용 할 지 결정 하지 않 는 것 이 바람 직 하 다.몇 달 전 만 해도 나 도 그 중 하 나 였 다.그러나 코드 성능 을 향상 시 키 기 위해 프로 그래 밍 에서 가장 좋 은 실천 을 배우 기 시 작 했 을 때 잘못된 데이터 형식 이 코드 에 어떻게 영향 을 미 치 는 지 알 게 되 었 습 니 다.나 는 이 개념 을 증명 하기 위해 시범 을 보 여줄 것 이다.
static void Main(string[] args)
{
List<Int32> li = new List<int>();
Stopwatch sw =new Stopwatch();
sw.Start();
for (int i = 0; i < 10000; i++)
{
li.Add(i);
}
sw.Stop();
Console.Write("Using Arraylist(Object)" + sw.ElapsedTicks + "
");
sw.Reset();
sw.Start();
Int32[] a = new Int32[10000];
for (int i = 0; i < 10000; i++)
{
a[i] = i;
}
sw.Stop();
Console.Write("Using Value(Integer Array)" + sw.ElapsedTicks);
Console.ReadLine();
}
위의 코드 에서 먼저 나 는 하나의 list 를 사용 하여 1000 개의 정수 치 를 저장 했다.두 번 째 로 같은 조작 을 실 행 했 을 때 나 는 정수 배열 을 사용 했다.나의 출력 캡 처 는 어떤 저장 체제 가 정수 배열 에 가장 적합 한 지 보 여 주 었 다.지금,당신 은 왜 이 list 가 더 많은 시간 을 써 야 하 는 지 생각 할 수 있 습 니 다.이 유 는 list 가 대상 형식 으로 데 이 터 를 저장 하고 우리 가 먼저 값 형식 을 저장 하려 고 할 때 인용 형식 으로 변환 한 다음 에 저장 하기 때 문 입 니 다.따라서 첫 번 째 는 항상 적당 한 저장 체 제 를 선택 하여 최고의 성능 을 얻 는 것 이다.
foreach 대신 순환 사용
나 는 지금 매우 재 미 있 는 사실 을 설명 할 것 이다.나 는 너희들 이 모두 for 와 foreach 순환 에 익숙 하 다 고 생각한다.지금 내 가 뭐 가 더 빠 르 냐 고 물 어보 면?음..모 르 겠 어 요.그 렇 죠?
얘 들 아,for 순환 이 foreach 순환 보다 훨씬 빠르다.아래 의 예 를 봅 시다.
List<Int32> Count = new List<int>();
List<Int32> lst1 = new List<Int32>();
List<Int32> lst2 = new List<Int32>();
for (int i = 0; i < 10000; i++)
{
Count.Add(i);
}
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < Count.Count; i++)
{
lst1.Add(i);
}
sw.Stop();
Console.Write("For Loop :- " + sw.ElapsedTicks + "
");
sw.Restart();
foreach (int a in Count)
{
lst2.Add(a);
}
sw.Stop();
Console.Write("Foreach Loop:- " + sw.ElapsedTicks);
Console.ReadLine();
걱정 하지 마 세 요.저 는 이미 발표 모드 에서 이 예 시 를 테스트 했 습 니 다.이 화면 캡 처 는 몇 번 의 테스트 가 실 행 된 후에 촬영 한 것 입 니 다.
클래스 를 언제 사용 할 지,구조 체 를 언제 사용 할 지 선택 하 십시오.
이러한 사실 을 받 아들 이 는 것 은 c\#의 구조 체 와 종 류 를 기본적으로 이해 하거나 가장 좋아 하 는 프로 그래 밍 언어 중의 구조 체 와 종 류 를 적어도 이해 하 는 것 이다(존재 한다 면).좋 습 니 다."오래전 에 구조 체 를 배 웠 지만 일상생활 에서 사용 해 본 적 이 없다"고 생각 했다 면 95%가 유형 과 구조 체 의 성능 을 측정 해 본 적 이 없 는 개발 자 중 한 명 입 니 다.걱정 마 세 요.이 글 을 쓰기 전에 나 도 없 었 다.
그럼 종 류 는 요?예,우 리 는 가끔 일상 프로젝트 개발 에서 한 가지 유형 을 실현 합 니 다.
지금 나의 문 제 는'어느 것 이 더 빠 릅 니까?유형 입 니까?구조 체 입 니까?'입 니까?나 는 네가 테스트 를 해 본 적 이 없다 고 생각 할 것 이 라 고 추측 했다.네,테스트 해 보 겠 습 니 다.아래 코드 좀 봐.
namespace BlogProject
{
struct MyStructure
{
public string Name;
public string Surname;
}
class MyClass
{
public string Name;
public string Surname;
}
class Program
{
static void Main(string[] args)
{
MyStructure[] objStruct = new MyStructure[1000];
MyClass[] objClass = new MyClass[1000];
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
objStruct[i] = newMyStructure();
objStruct[i].Name = "Sourav";
objStruct[i].Surname = "Kayal";
}
sw.Stop();
Console.WriteLine("For Structure:- " + sw.ElapsedTicks);
sw.Restart();
for (int i = 0; i < 1000; i++)
{
objClass[i] = newMyClass();
objClass[i].Name = "Sourav";
objClass[i].Surname = "Kayal";
}
sw.Stop();
Console.WriteLine("For Class:- " + sw.ElapsedTicks);
Console.ReadLine();
}
}
}
출력 결 과 는 다음 과 같 습 니 다.지금 은 구조 체 가 종류 보다 훨씬 빠르다 는 것 이 분명 하 다.마찬가지 로 저 는 발표 모드 에서 이 코드 를 테스트 하고 최소 20 개의 출력 을 얻어 프로그램 이 안정 적 인 위치 에 이 르 도록 했 습 니 다.
지금 가장 큰 문 제 는'왜 구조 체 가 클래스 보다 빠 릅 니까?'
우리 가 알 고 있 는 바 와 같이 구조 체 변 수 는 값 유형 이 고 값(또는 구조 체 변수)은 한 위치 에 저 장 됩 니 다.
클래스 대상 은 참조 형식 입 니 다.대상 형식 이 라면 인용 을 만 들 고 메모리 의 다른 위치 에 값 을 저장 합 니 다.기본적으로,값 은 관리 가능 한 더미 에 저장 되 어 있 으 며,바늘 은 창고 에 생 성 됩 니 다.이러한 방식 으로 메모리 에서 대상 을 실현 하 는 데 는 구조 체 변수 보다 더 많은 시간 이 걸린다.
문자열 연결 작업 은 항상 Stringbuilder 를 사용 합 니 다.
이 점 은 개발 자 들 에 게 매우 중요 하 다.대량의 문자열 조합 작업 을 할 때 String 대신 StringBuilder 를 사용 하 십시오.코드 성능 에 미 치 는 영향 을 보 여주 기 위해 다음 예제 코드 를 준비 하 였 습 니 다.나 는 for 순환 에서 500 번 의 문자열 조합 작업 을 실 행 했 습 니 다.
public classTest
{
public static string Name { get; set; }
public static string surname;
}
class Program
{
static void Main(string[] args)
{
string First = "A";
StringBuilder sb = new StringBuilder("A");
Stopwatch st = new Stopwatch();
st.Start();
for (int i = 0; i < 500; i++)
{
First = First + "A";
}
st.Stop();
Console.WriteLine("Using String :-" + st.ElapsedTicks);
st.Restart();
for (int i = 0; i < 500; i++)
{
sb.Append("A");
}
st.Stop();
Console.WriteLine("Using Stringbuilder :-" + st.ElapsedTicks);
Console.ReadLine();
}
}
이것 은 출력 입 니 다:클래스 데이터 구성원 을 할당 하 는 가장 좋 은 방법 을 선택 하 십시오.
클래스 변 수 를 할당 하기 전에 다음 코드 와 출력 화면 을 보 는 것 을 권장 합 니 다.
namespace Test
{
public class Test
{
public staticstring Name { get; set; }
public staticString surname;
}
class Program
{
static void Main(string[] args)
{
Stopwatch st = new Stopwatch();
st.Start();
for (int i = 0; i < 100; i++)
{
Test.Name = "Value";
}
st.Stop();
Console.WriteLine("Using Property: " + st.ElapsedTicks);
st.Restart();
for (int i = 0; i < 100; i++)
{
Test.surname = "Value";
}
st.Stop();
Console.WriteLine("Direct Assign: " + st.ElapsedTicks);
Console.ReadLine();
}
}
}
예,우리 의 출력 화면 은 속성 을 사용 하여 데 이 터 를 분배 하 는 것 이 직접 분배 하 는 것 보다 훨씬 느리다 는 것 입 니 다.
이상 은 c\#코드 를 개선 하 는 다섯 가지 기술(2)의 상세 한 내용 입 니 다.c\#코드 개선 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.