어제 .NET 성능을 최대화하는 방법에 대한 기사를 올렸는데 많은 의견이 있었습니다. 그 중 일부는 기사에서 몇 가지 오류를 지적해 주셔서 감사합니다. 많은 혜택을 받았습니다.
어제 기사에서는 코드 작성의 일부 세부 사항부터 속도 향상에 중점을 두었습니다. 실제로 성능 향상을 체감하기 어려울 수도 있지만, 프로그래머로서 자신의 코드 품질을 지속적으로 향상시키는 것이 끊임없이 추구하는 목표입니다.
실제로 하드웨어가 발전함에 따라 하드웨어의 속도는 이제 대부분의 사람들의 요구를 충족시킵니다. 일부 사람들은 현재 소프트웨어 개발에서 알고리즘의 효율성이 점점 떨어지고 있다고 제안하기도 합니다. 예전에 MIT에서 데이터 구조 영상을 본 기억이 있는데, 강의를 해주신 교수님께서 질문을 하신 기억이 납니다. (명확하게 기억은 안 나지만, 그 뜻은 이랬습니다.) 알고리즘은 더 이상 중요하지 않은데 우리는 왜 아직도 여기에 있는 걸까요? 연구는 어떻습니까? 그가 내놓은 대답은 'SPEED'였다. 레이싱 드라이버들이 속도를 추구하듯 우리도 속도를 추구한다!
오늘날 많은 시스템 개발에서는 속도가 최우선 순위가 아닙니다. 안정성, 보안, 재사용성 등이 최우선 순위가 되는 경우가 많습니다. 요즘 디자인 패턴, 개발 아키텍처 등은 주로 성능 문제를 해결하기 위해 설계되지 않습니다. 위의 내용은 분석가와 설계자가 고려합니다. 우리와 같은 소규모 프로그래머는 코드, 클래스, 메서드 및 코드 줄의 일부 작은 위치에서만 프로그램을 최적화할 수 있습니다. 디테일에 좀 더 신경쓰는 게 좋은 것 같아요.
자, 이제 헛소리는 그만하고 오늘의 주제에 대해 이야기해 보겠습니다. 현재 개발된 많은 네트워크 시스템의 성능 오버헤드는 주로 데이터 읽기 및 전송에 관한 것입니다. 우리가 추구하는 목표는 더 빠른 읽기 속도와 더 적은 네트워크 대역폭입니다. 이러한 측면에서 .net의 성능을 향상시키는 방법에 대해 이야기하겠습니다.
1. 데이터 계층의 데이터를 페이징합니다. ExcuteReader 또는 저장 프로시저를 통해 구현할 수 있습니다. 따라서 자세한 내용은 다루지 않겠습니다. (제가 작성한 내용은 읽어보실 수 있습니다.)
2. Microsoft에서는 ExcuteReader를 사용하는 것이 가장 효율적입니다. PetShop 4.0에서는 비연결에 대한 특별한 요구 사항(예: SmartClient 등)이 없는 한 모든 데이터에 액세스할 수 있습니다.
3. 연결되지 않은 상황에서는 여러 관계형 테이블을 저장하려는 경우가 아니면 DataTable을 사용하는 것이 DataSet을 사용하는 것보다 성능이 더 좋습니다.
4. DataTable의 ImportRow 메서드를 사용합니다.
한 DataTable에서 다른 DataTable로 많은 양의 데이터를 복사해야 하는 경우가 있는데, DataTable의 ImportRow 메서드를 사용하면 데이터 양이 적을 때 큰 차이가 없습니다. 10,000개 이상의 행에 도달하면 크게 개선될 수 있으며 여러 번 도달할 수 있습니다.
5. 쉬운 전송을 위해 데이터를 바이너리 파일로 직렬화합니다.
DataSet 및 DataTable 개체를 처리할 때 이를 XML 파일로 직렬화할 수 있습니다. 이러한 개체를 네트워크를 통해 전송하려면 XML 파일로 인해 메모리 및 네트워크 대역폭과 같은 리소스 문제가 발생합니다. 이때 바이너리 파일로 직렬화하면 생성되는 파일이 많이 줄어들 수 있습니다. 코드는 다음과 같습니다.
FileStream fs = new fileStream(@"XMLData.bin",FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs,XMLData);
fs.colse();
이렇게 생성된 바이너리 파일을 XMLBinary라고 합니다. WINHEX로 직접 열면 그 안에 일부 XML 태그가 표시됩니다. 데이터 양이 많은 경우 다음 코드 한 줄을 추가하세요.
XMLData.RemortingFormat = SerializationFormat.Binary;
이때 생성되는 파일을 TrueBinary 파일이라고 합니다. 많은 수(10,000라인 이상)를 처리할 경우 생성되는 파일 크기는 XMLBinary의 일부입니다. 스키마는 직렬화 중에 자동으로 저장되므로 역순화 프로세스가 간단해집니다. XML을 직접 읽는 것과 비교하여 역직렬화의 성능 저하가 얼마나 되는지는 아직 모르겠습니다.
6. 연결 풀을 합리적으로 활용하십시오.
연결 풀링은 성능 향상에 큰 역할을 하며 기본적으로 켜져 있습니다. 기본 최소 풀 크기는 0이며 일반적으로 5와 같이 상대적으로 작은 값으로 설정됩니다. 기본 최대 풀 크기는 100이며 대부분의 웹 사이트에 충분합니다. 대규모 웹 사이트의 경우 적절하게 늘리십시오.
7. SQLCLR을 사용하여 개발
SQL Server 시리즈를 여는 데 중점을 두고 있다면 SQLCLR을 연구해야 합니다. SQLCLR은 매우 강력하며 많은 상황(특히 대규모 엔터프라이즈 수준 응용 프로그램)에서 성능을 향상시킬 수 있습니다.
8. 정적 클래스를 통해 APP.Config/Web.Config에 액세스합니다.
매우 자주 액세스되는 APP.Config/Web.Config에 많은 구성 정보가 있습니다. 이때 정적 클래스를 생성합니다. 모든 속성은 정적 클래스를 통해 액세스되므로 어느 정도 성능이 향상될 수 있습니다. 정적 클래스는 인스턴스 Config를 한 번만 수행하고 APP.Config/Web.Config는 많은 IO 작업을 생성합니다.
공개 정적 클래스 MyWebConfig
{
정적 MyWebConfig()
{
ConnString =
ConfigurationManager.ConnectionStrings["연결"].
연결문자열;
}
공개 정적 문자열 DbConnectionString
{
얻다
{
ConnString을 반환합니다.
}
}
}
자, 오늘은 여기까지입니다. 어떤 실수나 부족한 점이라도 지적하고 더 나은 의견을 제시하고 함께 발전해 나가면 좋겠습니다.