문제

시스템 작업에서 여기에 기록되었다.net2.0 고 있지 않았다의 이익을 generics.그것은 결국 2.0 으로 업데이트하지만,없음의 코드는 refactor 시간 제약으로 인해.가 있는 장소의 숫자는 코드를 사용합니 ArraysLists etc.저장하는 일로 개체입니다.

성능의 관점에서,얼마나 중요한 코드 변경을 사용하여 제네릭?난에서 perfomance 관점,복싱과 unboxing etc., 는 것은 비효율적이지만,얼마나 많은 성과를 얻을 것입니다 정말 거기에서 그것을 변경하면?제네릭를 사용하는 것에 앞으로 이동으로 또는 그것은 거기에 충분하의 성능을 변경하는 양심의 노력해야한 업데이트 오래 된 코드가?

도움이 되었습니까?

해결책

기술적으로 성능의 제네릭이 말씀하신 대로,더 낫습니다.그러나지 않는 한,성능은 상당히 중요하고 당신은 이미 최적화되어 다른 지역에서 당신은 가능성이 훨씬 더 좋아질 개선 지출에 의해 귀하의 시간습니다.

I would suggest:

  • 제네릭을 사용해서 진정한 가치를 발견 할 수 있습니다
  • 이 있는 경우 단단한 단위 테스트는 다음 리팩터를 제네릭으로 당신은 터치 코드
  • 을 보내는 다른 시간을 리팩토링/측정하는 것입니다 크게 성능을 향상시킬(데이터베이스는 호출,변화하는 데이터 구조,등등)보다 몇 밀리초 단위입니다.

물론 다른 이유로보다는 성능을 변경하 generics:

  • 적 오류가 발생하기 쉬우므로,당신이 컴파일 타임 검사의 종류
  • 더 읽을 수 있는,당신은 당신이 필요하지 않을 주고 그것은 분명한 어떤 유형에 저장된 컬렉션
  • 를 사용하는 경우 제네릭이 앞으로,그것은 청소를 사용하여 그들을 어디에나

다른 팁

여기 결과 내에서 간단한 구문 분석의 문자열에서 100KB 파일 100,000 번입니다.일반 목록(char)했 612.293 초 100,000 시간을 통해 파일입니다.ArrayList 했 2,880.415 초 100,000 시간을 통해 파일입니다.즉 이 시나리오에서(당신의 마일리지 변경 가능)일반 목록(char)은 4.7 배 더 빠릅니다.

여기에는 코드는 실행을 통해 100,000 시간:

Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
    Dim genList As New ArrayList

    For Each ch As Char In strToProcess.ToCharArray
        genList.Add(ch)
    Next

    Dim dummy As New System.Text.StringBuilder()
    For i As Integer = 0 To genList.Count - 1
        dummy.Append(genList(i))
    Next

End Sub

 Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
     Dim genList As New List(Of Char)

     For Each ch As Char In strToProcess.ToCharArray
         genList.Add(ch)
     Next

     Dim dummy As New System.Text.StringBuilder()
     For i As Integer = 0 To genList.Count - 1
         dummy.Append(genList(i))
     Next
 End Sub

유일한 방법은 확실히 알고 있는 프로파일링에 코드 같은 도구를 사용하여 dotTrace.

http://www.jetbrains.com/profiler/

그것을 가능성이 복싱/unboxing 은 사소한의 특정 응용 프로그램 및 가치가 있지 않을텐데 refactoring.앞으로,당신은 여전히 고려하여 제네릭으로 인해 컴파일 시간 형식의 안전성이 낮아집니다.

제네릭 여부,Java.물,사용되어야에 대한 디자인과 유형을 안전하지 성능을 향상시킬 수 있습니다.Autoboxing 에서 다른 제네릭(본질적으로 암시적인 개체를 기본 변환),그리고 당신이 언급,사용하지 않아야 합니다 그들의 장소에서 원시적이 있는 경우 많은 수의 연산하거나 다른 작업을 하는 것이 성능에서 반복되는 암시적 객체 생성/다.

전반적인 것이 좋을 사용하여 앞으로만 업데이트하는 기존의 코드할 필요가 있는 경우 회사는 청소를 위한 형식의 안전성/디자인 목적지 않는 성능이다.

그것에 따라,최고의 대답은 프로필에 코드를 참조하십시오.나는 다음과 같 AQTime 지만 패키지의 번호를 위해 존재한다.

에서 일반적인 경우,ArrayList 사용이 많이 가치가 있을 수 있습니다 그것을 전환하여 일반 버전입니다.정말이지만,그것은 가장 가능성이 높지 않을 수도 성능을 측정하는 차이입니다.복싱과 unboxing 은 추가적인 단계이지만 현대 컴퓨터 그래서 빠르는것이 거의 차이가 없습니다.로 ArrayList 은 정말 그냥 정상적인 배열을 가진 좋은 래퍼,당신은 아마 더 많은 성능에서 얻은 더 나은 데이터 구조 selection(ArrayList.Remove O(n)!) 상으로 전환하는 제네릭입니다.

편집:무법자 프로그래머는 좋은 지점,당신은 여전히 복싱과 unboxing 과 제어를 사용한다.모든 코드위 검사에 대한 예외 및 null 주고"입/로"키워드는 것이 도움을 조금만.

가장 큰 이익을에서 찾을 수있는 유지보수 단계로 구성됩니다.제네릭은 훨씬 쉽게 처리하고,업데이트를 처리하지 않고 변환하고 캐스팅 문제입니다.이 코드는 지속적으로 방문하는,모든 수단에 의해 취합니다.이 코드되지 않은 감동에 나지 않을 정말로 괴롭히다.

무엇 autoboxing/unboxing 함께 할 수 있는 제네릭?이것은 단지 유형-안전 문제입니다.Non-일반적인 컬렉션을 할 필요가 있는 명시적으로 캐스팅을 객체의 실제 유형입니다.제네릭,이 단계를 건너뛸 수 있습니다.지가 있다고 생각하지 않은 성과의 차이는 방법 중 하나 또는 다른합니다.

나의 오래된 회사를 실제적으로 이 문제를 해결합니다.우리가 접근했었:는 경우에 그것의 쉬운 형식,그것;하지 않을 경우(i.e그것은 터치 너무 많은 클래스),그것을 둡니다.그것은 정말에 따라 달라지는지 당신은 그것을 하는 시간,또는지 여부가 더 중요한 항목을 코딩(i.e기능어야 합 구현한 클라이언트).

다시,당신이에 작동하지 않는 무언가를 위해 클라이언트에 가서 시간을 보내고 refactoring.그것을 향상시킬 수 있습니다.의 가독성 코드에 대한 자신입니다.

얼마나 많은지에 따라 달라집니다 거기에서 당신의 코드입니다.는 경우 바인딩 또는 디스플레이 큰 나열 UI 에서,당신은 아마도 대조를 얻을 수 있습니다.

하는 경우 ArrayList 은 그냥 뿌리고 여기에 대해하고있다,그것은 아마 없을 것을 그냥 그것은 청소하지만,또한 영향을 주지 않 전반적인 성능에 매우 많습니다.

를 사용하는 경우 많은 ArrayLists 내의 코드가 될 것입 untertaking 들을 대체하기(무엇인가에 영향을 미칠 수 있는 일정),다음을 채택할 수 있는 경우-당신은 터치 그것을 변경-그것은 접근 방식이다.

중요한 것은,하지만,제네릭은 많이 읽기 쉽고,더 안정적인 응용 프로그램을 통해로 인해 이 강력한 당신이 그들에게서 얻.당신이 볼 수익이 아니라 성능,하지만 코드에서 maintainablity 과 안정성.는 경우에 당신은 그것을 할 수 있는 빠르게,나는 그것을 하십시오.

을 얻을 수 있다면에서 구매에서 제품의 소유자,나는 추천을 받고 그것이 정리됩니다.당신이 사랑하는 코드를 나중에 있습니다.

는 경우에는 엔티티에 ArrayLists 은 개체 형식을 얻을 것이 작은지 그들을 캐스팅하는 올바른 형식입니다.만약 그들이 가치 종류(구조체 또는 기본 형식과 같은 Int32),다음은 복싱/unboxing 프로세스에 많은 추가의 오버헤드를,그리고 일반적인 컬렉션을 해야 훨씬 빠릅니다.

여기에는 MSDN 문서에서 주제

제네릭은 훨씬 더 나은 성능을 가지고 있으며 경우에 특히 사용할 값을 입력(int bool,구조체 등) 어디에 당신을 얻을 것 noticeble 성능 향상에 도움이 됩니다.

  1. 사용 Arraylist 과 가치 유형이 원인을 복싱/unboxing 는 경우 몇 백 배 substantialy 느린 다음을 사용하여 일반 목록입니다.

  2. 저장할 때 가치 유형으로 개체 당신은 네 시간 메모리당 항목입니다.이 금액을 배출하지 않습니 RAM 캐시 메모리는 작은 포함될 수 있습 항목을 의미하는 동안 반복하는 길은 컬렉션이있을 것 복사본에서 메모리를 캐쉬하는 것 천천히 당신의 응용 프로그램입니다.

에 대해 썼 .

를 사용하여 제네릭 또는 당신의 코드 간단하고 쉽게 사용할 경우를 활용하려는 것과 같은 linq 에서 후 c#버전입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top