우리는 네트워크에서 지속적으로 엄청난 양의 데이터를 읽는 응용 프로그램을 보유하고 있습니다. 우리는 GC (gen0 컬렉션의 누적 효과조차도 발견했습니다. 우리는 결과를 뒷받침하기 위해 ETW 수집을 사용했습니다.)를 가장 큰 병목으로 인식하여 메모리 풀링을 수행하여 콜렉션이 실행되지 않도록했습니다.모든 메모리가 사전 할당되어 풀링 된 전선에서 기본 유형 (int, decimal, Datetime ...)으로 변환 - System.String을 우회하는 방법
우리는 거대한 바이트 배열을 할당없이 네트워크에서 연속적으로 읽으려면 인코딩 배열을 사용하여 변환을 피하기 위해 인코딩 배열에서 동일한 작업을 수행 할 수 있지만 기본 유형 (int, decimal ..)으로 변환하는 방법은없는 것처럼 보입니다. .) BCL이 TryParse 메서드에서 수행하는 작업을 다시 구현하는 것을 의미하거나) 쓰레기를 만들지 않고 (char []를 버려지는 문자열로 변환하지 않고).
- 어떻게 든 문자열에 문자 배열을 삽입, 또는 기타 메모리의 재사용 가능한 풀에서 메모리를 할당 할 수있는 문자열을 강제 할 수 있는가 :
그래서 여기 내 질문입니까? 나는 문자열의 반영 내부에보고되었고, 불가능한 작업이 될 것 같다,하지만 난
또는
- 이 가능한 기본 유형으로 변환하는 몇 가지 표준 변환 기능을 활용하는 것입니다 어떤 제안을 환영 char [] (또는 다른 텍스트이지만 System.String 형식은 아님)? 다시 - 나는 System.Number의 반사 된 코드를 조사하고 있었다. 위장 함수가 char *을 취하는 것처럼 보이므로 반사를 통해 호출 할 수있다. 그러나 DateTime 변환은 여전히 문자열을 사용합니다.
모든 의견을 환영합니다.
나에게 C#을 사용할 수없는 것 같습니다. – Sinatr
프로토콜을 변경하여 이러한 유형이 처음에는 텍스트 표현으로 변환되지 않도록 할 수 있습니까? 아니면이 한쪽 끝만 통제 할 수 있습니까? –
@Damien_The_Unbeliever 아주 좋은 지적입니다. 불행히도 구독 엔드 포인트를 제어 할뿐입니다. 그리고 프로토콜은 엄격한 텍스트 표현입니다. – Jan