2009-09-15 3 views
5

은 (이것은 내가 .NET이 돼지라고 징징과 이유 구걸, 일반 가정 문제 될 운명이되었다. 그것은 정말 내 특정 응용 프로그램에 대한 질문이 될 운명이되지 않았습니다.).NET에서 왜 CPU를 많이 사용하는 이유는 무엇입니까?

은 현재 내가 C#에서 오래된 C++ 코드를 다시 작성합니다. 우리는 모든 레거시 응용 프로그램을 포팅하고 있습니다. MAX 3 % CPU를 사용하는 C++ 응용 프로그램이 있습니다. 대부분 그들은 아무 것도 사용하지 않습니다. 그런 다음 코드를 가져 와서 복사하여 붙여 넣은 다음 C# 구문 및 .NET 라이브러리로 다시 포맷하고 BAM! 50 % CPU. 이것에 대한 이유는 무엇입니까? 나는 처음에는 JIT라고 생각했지만, 각 코드 경로가 연습 된 후에도 모든 것이 JIT ed, 같은 문제였다.

나는 또한 엄청난 메모리 증가를 발견했습니다. 풀로드를 실행하는 9MB의 응용 프로그램은 이제 10MB에서 시작하여 50MB에서 실행됩니다. 하드웨어가 저렴하다는 것을 알고 있지만, 원인을 이해하고 싶습니다. 그것은 알람에 대한 원인인가, 아니면 .NET에 불과합니다.

업데이트 1 답변

내가 C#을 익숙 스키트합니다. 나는 Linq에게 물건을 바꾼다. 필자는 일반적으로 코드를 사용하여 줄 수를 줄이는 등의 작업을 수행합니다. .NET에서 C++ 사용자가 저의 잘못에 대해 더 많은 예제를 제공 할 수 있습니까? 다음과 같이

이것은 일반적인 질문이 될 운명이되었다 2

업데이트,하지만 문제가있는 특정 응용 프로그램입니다.

paradox db에서 데이터를 가져 오기 위해 ODBC 드라이버를 사용하는 스레드가 있습니다. 그런 다음 Linq를 사용하여 이것을 SQL db로 변환하고 게시합니다. ANTS 프로파일 러를 통해 실행했으며 데이터 채우기 시간이 가장 많이 걸리는 것으로 보입니다. Linq 게시가 뒤따라. 내 영역 중 일부는 반사 사용법을 알고 있지만이 작업을 수행하는 방법을 알지 못합니다. 내 문자열을 문자열 빌더로 변경할 계획입니다. 이 둘 사이에 어떤 차이가 있습니까?

ConvertTo.Int32(datarow["Index"]) 

(int)datarow["Index"] 

나는 형식 문자열에 모든 문자열 연결을 변경했습니다. 그것은 머리를 줄이지 못했습니다. 데이터 판독기와 데이터 어댑터의 차이점을 알고있는 사람이 있습니까?

+9

이론적 인 예제가 필요한 대신, 프로파일 러를 사용하여 응용 프로그램이 CPU를 소비하는 이유와 위치를 확인하는 것이 좋습니다. – ChrisW

+1

소리가 ODBC와 상호 작용하는 것 같습니다. 사용할 수있는 "기본".NET Paradox 드라이버가 있습니까? –

+3

CPU 사용 시간은 50 %입니까? 무슨 일로? 연구 한 CPU 중심의 미니 벤치 마크에서 C++은 C#보다 빠르지 만 많이 사용하지는 않았습니다. 각각의 경우에 나는 최고의 처리량을 얻기 위해 CPU를 포화 상태로 만들었습니다. – Cheeso

답변

17

C# 및 .NET에 얼마나 익숙합니까? C++ 관용구를 유지하면서 레거시 코드를 포팅하는 중이라면, 그것이 돼지라는 것에 전혀 놀란 것은 아닙니다. 하나의 플랫폼에서 다른 플랫폼으로 응용 프로그램을 그대로 이식하는 것은 결코 좋은 생각이 아닙니다. 물론 C++ 개발자이지만 초심자 인 .NET 개발자라면 에 코드를 입력해야을 수행하는 것처럼 기대할 수 있습니다. 플랫폼.

앱에 대해 더 이상 알지 못하면 무엇이 성능을 내는지 말할 수 없습니다. 비록 문자열 연결이 범인이라는 사실을 듣고 놀라지 않을지라도 말입니다. 상자에 몇 개의 프로세서가 있습니까? 이 2,의 경우 응용 프로그램은 기본적으로

.NET은 일반적으로 C++ 응용 프로그램에 비해 메모리의 측면에서 무거운 될 것입니다 ... 단일 스레드를 위해 할 수있는 모든 것을 차지하지만해야 적어도 비교 대부분의 작업에서 속도 측면에서. 9MB 대신 50MB를 사용하면 기대했던 것보다 더 많은 소리가 들리지만, 즉각적으로 이되지는 않을 것입니다. 걱정됩니다.

좋은 프로파일 러를 사용하여 메모리와 CPU 성능을 모두 조사해야합니다. 나는 JetBrains dotTrace Profiler을 추천 할 수 있지만 거기에는 많은 다른 사람들이 있습니다.

+0

몇 가지 예를 더 주시겠습니까? –

+0

C++ 녀석이 할 수있는 초보 .NET. –

+3

예를 들면? 앱에 대해 알지 못하면 병목 현상이 어디에서 발생했는지를 추측하기가 매우 어려울 것입니다. 심지어 LINQ를 사용하는 경우 조심하지 않으면 병목 현상이 발생할 수 있습니다. 나는 정말로 프로파일 러를 갈 것입니다 - 다른 것은 추측 일뿐입니다. –

0

메모리 사용량이 줄을 알았지 만 CPU 사용량은 그렇지 않습니다.

당신은 항복하지 않는 스레드가있는 것 같습니다.

1

CPU 사용량이 약간 증가해야합니다. 3 ~ 50 %는 너무 많이 들리고, 어떤 종류의 코드입니까?

메모리 사용량은 피할 수없는 비용입니다. .NET 응용 프로그램의 경우 30-50MB 사이의 모든 것은 정상입니다. 일반적으로 .NET 응용 프로그램의 실제 메모리 사용량은 매우 적지 만 피할 수없는 상당한 시간의 오버 헤드가 있습니다 (이는 일회성 비용이지만 거기에 있습니다). 그리고 어셈블리 톤을 참조하면 매우 눈에니다 .

0

나는 몇 가지 추측을 생각할 수 있습니다

1) 메모리 - C++은 메모리를 관리하지 않습니다. 그래서, 메모리를 점진적으로 그리고 최적의 시간에 (최적으로 프로그램 된 경우) 해제합니다.

관리 메모리를 사용하면 프로그램에서 기본적으로 쓰레기 제거 작업을 수행 할 때까지 메모리가 "누출"됩니다. 아마도 프로세스에 할당 된 메모리 양에 따라 시간이 달라질 수 있습니다. 기본 동작을 변경하는 방법이 있지만 메모리 크기가 작 으면 처리 시간에 영향을주는 가비지 수집을 더 빨리 및 더 자주 수행해야합니다. memo9ry가 충분히 할당 된 경우 gc는 invoke 될 필요가 없습니다.

2) 프로그램이 같은 시간 내에 실행됩니까? 5 배의 프로세서 전력을 사용하지만 시간이 1/5로 완료되면 CPU 사용량은 기본적으로 동일합니다.

3) 예, .NET은 아마 돼지

+1

.Net을 호출하는 경우 귀하의 이름은 매우 적합합니다 –

+0

못 찾았습니다 :) 개인적으로 나에게는 "돼지"가되는 것과 관련하여 잘못된 것이 없습니다. 저는 VB .NET이 가장 좋습니다. 나는 80 년대 후반에 인터 리스프 이후로 보았으며 멋진 데모/연구/개념 증명 대신 상업용 응용 프로그램을 제공하는 데 사용할 수있는 프레임 워크를 뒷받침합니다. Java의 주된 교훈은 "이제는 돼지가 되어도 괜찮습니다. 마이크로 소프트가 마음에 새기고, 마음 속에서 훨씬 더 나은 방법으로 (좋은 IDE, 더 효율적인 생성 된 코드) 구현 한 충분한 프로세싱 성능"이라고 생각합니다.). 그것은 돼지지만 아주 빨리 돼지 :) –

6

AFAIK (int)datarow["Index"]ConvertTo.Int32(datarow["Index"]) 사이 litte 차이가있다. 이 랜덤 액세스에 필요한 추가 캐시를 제거 않기 때문에

int orderIndex = <order of Index column in projection list>; 
using (OdbcDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) 
{ 
    int Index = rdr.GetInt32(orderIndex); 
} 

SeqentialAccess 명령의 동작은, SQL 결과를 처리 할 수있는 fastes 방법 : 당신이 스트림 모드 데이터 판독기를 사용하는 경우에는 큰 차이가 있습니다.

두 번째주의 사항은 데이터 세트를 사용중인 것 같습니다. 데이터 세트는 사용하기 쉽지만 누구나 '빨리'호출 할 수있는 것과는 아주 멀리 떨어져 있습니다. 데이터 세트를 사용하면 기본적으로 메모리 저장 엔진을 실행하고 있습니다 (나는 Rushmore을 기반으로 생각합니다). 모든 CPU주기와 RAM의 모든 비트에서 1을 모두 압축하려면 더 린 구성 요소 (예 : 데이터 집합 및 DataTables 대신 구조체의 원시 배열)를 사용해야합니다.

사과와 사과를 비교할 때 CLR은 기본 코드와 비교할 수 있습니다. IL 코드는 배포시 NGEN으로 초기화 할 수 있습니다. 일반적인 CLR 오버 헤드는 bounds checks can be avoided입니다. GC 선점 '일시 중지'는 할당이 부주의 한 경우에만 발생합니다 (GC가 좌우 할당을 의미하지는 않기 때문). 또한 CLR은 액세스 패턴에 맞게 메모리의 객체를 다시 배치 할 수 있고 TLB 및 L2 지역을 향상시킬 수 있기 때문에 메모리 레이아웃과 관련하여 실제로 몇 가지 장점을 가지고 있습니다.당신은 'C#을 주위에 원을 실행할 수 있습니다 C++'뭔가 새로운 논쟁을 생각하는 경우

BTW, 나는 C는 (그들이 말하는 된 '가상 통화가 엄청나게 느리다') ++ C의 주위에 원을 실행할 수있는 시간을 기억하고 내가 거기 듣고 C 주위에서 원이 돌아가는 시간 어셈블리였습니다.

관련 문제