2010-03-26 4 views
1

전 완전히 할당되지 않도록 위임장으로 라이브러리를 다시 작성합니다. 목표는 앱의 시작 단계가 완료된 후 0 개의 컬렉션을 유지하는 것입니다. 내가 문자열을 할당하는 것으로 판단Ascii Bytes Array Int32 또는 Double

Int32 foo = Int32.Parse(ASCIIEncoding.ASCII.GetString(bytes, start, length)); 

:

이전에는이 ​​같은 전화가 많이있었습니다. 나는 자동으로 똑같은 일을 할 C# 라이브러리 함수를 찾을 수 없었다. BitConverter 클래스를 살펴 보았지만, Int32가 실제로 나타내는 바이트로 인코딩 된 경우 인 것 같습니다. 여기에 Int32를 나타내는 Ascii 문자를 나타내는 바이트 배열이 있습니다.

는 여기에 내가

public static Int32 AsciiBytesToInt32(byte[] bytes, int start, int length) 
{ 
    Int32 Temp = 0; 
    Int32 Result = 0; 
    Int32 j = 1; 

    for (int i = start + length - 1; i >= start; i--) 
    { 
      Temp = ((Int32)bytes[i]) - 48; 

      if (Temp < 0 || Temp > 9) 
      { 
       throw new Exception("Bytes In AsciiBytesToInt32 Are Not An Int32"); 
      } 

      Result += Temp * j; 
      j *= 10; 
    } 

    return Result; 
} 

사람이 이미 더 최적의 방법으로이 작업을 수행 C#을 라이브러리 함수를 알고 있나요 무슨 짓을했는지? 또는 위의 실행 속도를 향상시키기위한 개선 사항 (아마 하루 중 수백만 번 호출 될 것입니다). 감사!

+3

전통적인 코드보다 관리 코드를 우월하게 만드는 것이 있다면 메모리 할당 비용이 매우 저렴합니다. 의도적으로 그것을 피하는 것은 올림픽스에서 경쟁하기 위하여 당신의 왼발을 떨어져 불기 같이이다. –

+0

메모리 할당이 저렴합니다. 가비지 콜렉션은 그렇지 않습니다. 엄청난 양의 쓰레기를 만들면 일반적으로 피해야 할 가치가있는 Gen2 힙에 상대적으로 수명이 짧은 개체를 넣을 수 있습니다. – Gabe

+0

동의. 우리는 콜렉션을 줄이려고합니다. 우리는 100ms까지 걸리는 Gen2 컬렉션을 볼 수 있습니다. 이 짧은 문자열은 큰 문제가 아니며 꽤 빨리 수집해야합니다. 그러나 그들은 그다지 제거하기가 어렵지 않습니다. 또한 앱의 지속적인 운영 단계에서 할당이 없다고 말하면 실제 할당량이 어디에서 오는지 쉽게 추적 할 수 있습니다. –

답변

5

하루에 수 백만 번은 문제가되지 않아야합니다. 초당 수십만 번 실행할 수 있기를 기대합니다. 개인적으로 위의 코드를 루프 내에서 "temp"로 선언하고 파스칼 케이스의 지역 변수 이름 인 urgh를 없애겠습니다.하지만 괜찮습니다. 당신의

Temp = ((Int32)bytes[i]) - 48; 

라인과 동일한 작업을 수행하지만, 간단한 방법 (IMO)에서

int digit = bytes[i] - '0'; 

:

코드는 더 즉시 이해와 같은 것입니다. 그들은 똑같은 방식으로 행동해야합니다.

일반적으로 할당없이 C#을 작성하려고하면 언어와 프레임 워크가 설계된 방식에 맞서 싸우게됩니다. 이게 이 실제로라고 생각하십니까? 틀림없이 일부 게임이 관리되는 코드로 작성되는 방식이라고 들었지만 다소 이상하게 보입니다. 바이트가 부적절한 경우 물론

, 당신은

편집 ... 예외를 할당하는거야 : 코드가 음수을 허용하지 않습니다. 괜찮습니까?

+1

그는 또한 오버 플로우를 처리하지 않습니다. – Gabe

+0

답장을 보내 주셔서 감사합니다. 네거티브 및 넘침에 중대한 포인트. 이 정수는 거의 작아야하지만 네거티브가 문제 일 수 있습니다. –

+0

할당하지 말았어야합니다.저는 우리 응용 프로그램의 시작 단계에서 거의 모든 것을 미리 할당하려고한다는 것을 의미했습니다. Gen2 컬렉션에 대해 100ms 동결이 적용될 수있는 앱이므로 여기에 설명 된 디자인 사례를 따르려고합니다. http://www.microsoft.com/downloads/details.aspx ? displaylang = ko & FamilyID = 4215ab9e-4181-4526-823b-d364448188b2 –