2012-05-17 1 views
11

xobotos의 reputed performance gains에 대해 궁금해서 이진 트리 benchmark code을 확인했습니다.XobotOS : C# 바이너리 트리 벤치 마크가 구조체를 사용하는 이유는 무엇입니까?

binary tree node

자바 버전입니다 :

private static class TreeNode 
{ 
    private TreeNode left, right; 
    private int item; 
} 

C# version입니다 : 내가 궁금하네요

struct TreeNode 
{ 
    class Next 
    { 
    public TreeNode left, right; 
    } 

    private Next next; 
    private int item; 
} 

무엇을 다음 및 이전 포인터 이후 여기 구조체를 사용의 이점, 여전히 클래스에 캡슐화되어 있습니다.

글쎄, 왼쪽과 오른쪽 포인터가 필요 없기 때문에 하나의 리프 노드가 순수 값 유형입니다. 노드의 절반이 나뭇잎 인 전형적인 이진 트리에서는 개체 수를 50 % 줄입니다. 그래도 성능 향상 효과는 훨씬 더 커 보인다.

질문 : 더 이상 있습니까?

또한 C#에서이 방식으로 트리 노드를 정의 할 생각이 없었기 때문에 (Xamarin에게 감사드립니다!) 다른 데이터 구조가 비 구조적 구조로 구조를 사용하면 어떤 이점이 있습니까? (비록 조금 화제가되어 개방적으로 끝났지 만)

+1

성능 향상은 무엇입니까? – leppie

+1

코드를 살펴보면 누군가가 실제로 무엇을하고 있는지 (또는 적어도 매우 어리석은 방식으로) 알지 못하고 C 코드에서 코드를 복사 한 것이 확실합니다. – leppie

답변

0

두 노드를 하나의 할당으로 그룹화하여 총 할당 수를 절반으로 줄이는 것이 이상적입니다.

IMO 이렇게하면 비교가 의미가 없습니다.

-1

여기서 구조체를 사용하면 전혀 차이가 없다고 생각합니다. 특히 TreeNode의 소스 코드를 살펴본 후 TreeNode의 인스턴스가 항상 생성자와 재귀 bottomUpTree 호출에 복사됩니다.

0

구조체는 힙 대신 스택에 할당 될 수 있지만 (모든 경우가 아님), 범위를 벗어나는 즉시 할당 취소됩니다. 가비지 수집기는 해당 시나리오에 관여하지 않습니다. 이로 인해 메모리 사용량이 줄어들고 가비지 수집이 줄어들 수 있습니다. 또한 스택은 (대부분) 인접한 메모리 영역이기 때문에 더 많은 로컬 영역을 가지기 때문에 CPU 수준에서 캐시 적중률을 향상시킬 수 있습니다. choosing between classes and structures

마이크로 소프트 지침 :

  • 구조 (16 바이트 일반적으로) 작고 단명는
  • 들은 다음을 통해 구조를 사용하는이 충족되는 경우 불변

,해야해야 클래스를 사용하면 성능이 향상됩니다.

1

나는이 이상한 코드를 가로 질렀고 같은 질문을했다. Java 버전과 일치하도록 코드를 변경하면 속도가 약간 느려집니다. 나는 대부분의 '구조체 TreeNode'가 박스 행을 얻고 하단 행을 제외하고는 할당된다고 믿습니다. 그러나 각 노드는 boxed TreeNode 및 next 클래스라는 두 개의 할당을 초래합니다. 할당 절감 효과는 빠르게 사라집니다. IMO, 이것은 구조체를 적절하게 사용하지 않습니다.

+0

+1 실제로 성능을 확인합니다.이 벤치 마크는 Java에 비해 Mono의 성능상의 이점을 과시하기 위해 만들어진 것이므로 이것이 아마도 이유라고 생각합니다. –

관련 문제