2009-10-09 3 views
3

하나의 Silverlight 앱에서 동일한 수학 연산이 다른 수학 연산보다 훨씬 오래 걸리는 이유가 있습니까?silverlight 수학 성능 질문

예를 들어, 포인트 목록을 가져 와서 변환하고 (비율을 조정하고 변환 한) 다른 포인트 목록을 채우는 코드가 있습니다. 원래 점을 그대로 유지해야하므로 두 번째 목록이 중요합니다.

여기 (규모가 두 배이며 원산지는 점이다) 관련 코드입니다 : 내가 루프와 타이밍을하고 있어요 방법

다음
public Point transformPoint(Point point) { 
     // scale, then translate the x 
     point.X = (point.X - origin.X) * scale; 
     // scale, then translate the y 
     point.Y = (point.Y - origin.Y) * scale; 
     // return the point 
     return point; 
    } 

이의 IT가 중요한 경우 :

  DateTime startTime = DateTime.Now; 
     foreach (Point point in rawPoints) transformedPoints.Add(transformPoint(point)); 
     Debug.Print("ASPX milliseconds: {0}", (DateTime.Now - startTime).Milliseconds); 

14356 포인트 (데스크톱 앱에서 실세계 번호로 모델링 한 질문하지 않음)의 경우 다음과 같이 분석됩니다.

Silverlight 앱 # 1 : 46 ms

Silverlight app # 2 : 859 ms

첫 번째 앱은 MainPage 생성자에서 루프를 수행하는 빈 앱입니다. 두 번째는 다른 클래스의 메서드에서 루프를 수행하고 있으며 GUI 스레드의 이벤트 핸들러에서이 메서드가 호출됩니다. 그러나 루프 자체 내에서 동일한 작업이 수행되고 있다는 것을 고려할 때 그 중 어떤 것이 중요할까요?

스레딩 작업이나 무언가에서 내가 누락 된 거대한 무언가가있을 수 있지만,이 불일치는 전혀 나에게 의미가 없습니다.

+3

코드를 벤치 마크하고 결과를 게시하려면 System.Diagnostics.StopWatch를 사용하십시오. DataTime 사용은 매우 부정확합니다. – ParmesanCodice

+3

또한 두 경우 모두 릴리스 빌드를 측정하고 있는지 확인하십시오. –

답변

2

나는 줄 약간의 사이를 읽을거야.

첫 번째 앱에는 MainPage 생성자에서 실행되는이 코드가 거의 분리되어 있습니다. IWO는 새로운 Silverlight 앱을 만들고이 코드를 쳤습니다.

두 번째 앱에는 실제로 실제 물건이 더 많이 있습니다. 적어도 루디먼트 UI를 클릭하면이 코드가 실행됩니다. 거기에 단서가 있습니다.

빈 앱을 가져 와서 버튼을 놓습니다. 그것을 실행하고 버튼을 클릭하십시오, 버튼은 무엇을합니까? 단추의 시각적 상태에 붙은 애니메이션이 있습니다.이 애니메이션 (또는 다른 애니메이션 또는 루프)은 버튼을 클릭 할 때 코드와 함께 실행될 가능성이 큽니다. 타이머 (StopWatch로 제대로 수행하든 그렇지 않든)는 스레드가 걸리는 시간뿐만 아니라 경과 된 시간을 기록합니다. 따라서 다른 스레드가 (애니메이션과 같은) 다른 작업을 수행 할 때 타이밍이 해제됩니다.

+0

이것이 제가 생각한 것입니다. 다른 구성 요소 또는 다른 스레드가 작업을 수행하면 내 수학 연산 속도가 느려집니다. 페이지의 유일한 다른 컨트롤은 내 포인트를 다시 그리는 마우스 움직임에 반응하는 ESRI Silverlight 맵입니다. 하지만 컴퓨터는 정말 빠릅니다 - 처리하는 시간이 너무 길어서 아주 단순한 수학 연산이 생겨서는 안됩니다. – Klay

1

첫 번째 의심은 Silverlight App # 2가 가비지 수집을 유발한다는 것입니다. 크기 조정 ~ 15,000 포인트는 밀리 초가 걸릴 것입니다. 이 아닙니다.

코드에서 메모리 할당을 줄이십시오. transformationPoint는 동적으로 증가하는 데이터 구조가 아닌 배열이 될 수 있습니까?

GC performance counters을 볼 수도 있지만 단순히 메모리 할당을 줄이면 더 간단해질 수 있습니다.

+0

원래는 rawPoints 목록을 만들 때 각 포인트를 transformedPoints 목록에 추가 했으므로 항상 동일한 크기가되어 프로그램 실행 동안 메모리 할당이 없습니다. 필자가 아는 한 목록의 크기가 절대로 변경되지 않으면 배열과 목록간에 성능 차이가 없습니다. – Klay

+0

또한 두 앱이 이렇게 다르게 작동하는 이유는 알 수 없습니다. – Klay

0

더 느리게 실행되는 앱에 의해 CLR에서 코드가 인라인되지 않을 수 있습니까?

SL에서 CLR이 인라인을 처리하는 방법을 잘 모르겠지만 여기 3.5 SP1에서 인라이닝을위한 선행 조건에 대한 링크가 있습니다. 다른 의견과 답변에 추가

http://udooz.net/blog/2009/04/clr-improvements-in-net-35-sp1/