2009-10-09 3 views
1

다음 두 가지 배열 (double **)을 C++로 교체하는 방법이 있습니다. 코드를 프로파일 링 할 때,이 메소드는 런타임의 7 %를 차지합니다 ... 저는 이것이 저비용 작업이되어야한다고 생각했습니다. 나는 C++에 익숙하지 만 배열에 대한 참조를 바꾸기를 바랬다.2D 배열을 C++로 바꾸기

62 void Solver::Swap(double** &v1, double** &v2) 
63 { 
64   double** vswap = NULL; 
65   vswap = v2; 
66   v2 = v1; 
67   v1 = vswap; 
68 } 
+1

inbuilt swap() 함수의 문제점은 무엇입니까? – Yacoby

+0

나는 그것을 몰랐다 ... 나는 C++을 처음 사용한다. 두 사람은 똑같이 수행합니다. – ccook

답변

4

1) 기능이 인라인되었는지 확인하십시오.

2) 당신은 올바른 위치 스왑, 인스턴스에 대한 XOR을 사용

3) 인수 대신 스택의 등록 사용하여 통과하도록 컴파일러에 강제로 시도 할 수 있습니다 (86에 등록 스트레스를 많이에도 불구하고, 그것은 시도 가치) - 표준 register 키워드를 사용하거나 MS 컴파일러에서 fastcall으로 재생할 수 있습니다.

typedef double** TwoDimArray; 

class Solver 
{ 
    inline void Swap(register TwoDimArray& a, register TwoDimArray& b) 
    { 
    a ^= b ^= a ^= b; 
    } 
}; 

4) vswap과 같은 임시 값을 지정하지 마십시오.

+0

클래스 정의 내에 정의 된 멤버 함수는 암시 적으로 인라인됩니다. – sbi

+0

좋은 해결책이지만 C++의 식별자는 숫자 "2DArray"로 시작하지 않습니다. – AraK

+0

내 실수, 너무 빨리 썼다. :) 문제가 해결되었습니다. 내부 클래스 메서드의 암시 적 인라인에 대해서는 스타일 문제이므로 인라인 및 가상 키워드를 강조하고 싶습니다. – NewbiZ

3

코드가 정상적으로 보입니다. 그것은 단지 포인터 할당입니다. 메서드가 호출 된 횟수에 따라 다릅니다.

+0

새 배열과 이전 배열을 바꿔 넣을 때마다 한 번 호출됩니다. 배열 자체는 2x20000입니다. 배열의 크기가 문제가 될 수 있습니까? – ccook

+0

배열 크기는 중요하지 않습니다. 그것의 포인터 할당. –

+0

프로파일 러를 사용할 때 문제가 될 수 있습니까 ?? – ccook

1

이 방법은 실제로는 두 가지 포인터 만 바꿔주기 때문에 프로파일 작성자는 조금 혼란 스러울 것입니다. 매우 저렴합니다. 이 방법이 인 경우가 아니면 프로필에 나타나서는 안됩니다. 프로파일 러가이 메소드가 얼마나 자주 호출되는지 알려줍니까?

스와핑에 대해 알아야 할 한 가지 문제는 한 배열이 캐시에 있고 다른 배열이 (특히 큰 배열 인 경우) 배열이 끊임없이 스와핑되어 캐시를 휴지통에 버릴 수 있다는 것입니다. 일반적인 천천히.

+0

배열이 크고 많이 바뀝니다. 그것은 내가 연구하고있는 RK4 방법에 사용되고 있습니다. 나를 괴롭히는 것은 스왑이 파생 상품 평가보다 더 많은 비용이 든다는 것입니다. 스왑은 스왑이 21 %, 파생 상품이 13 %에 불과하지만 스왑은 502에 불과하지만 파생 상품은 약 24M으로 계산됩니다. 파생 상품은 다소 단순한 atm ... (t^3)이지만 모두 동일합니다. – ccook

+0

또한 스왑이 인라인 됨 (최적화가 실행중인 경우, 그렇지 않은 경우)으로 인해 숫자가 왜곡 될 수 있습니다. – Anteru

1

완전히 최적화 된 코드를 작성하셨습니까?

이 기능은 inline입니다.

그 밖의 다른 점은 처음에 NULLvswap에 할당하고 바로 뒤에 다른 값을 할당한다는 것입니다.하지만이 문제는 최적화 프로그램에서 처리해야합니다.

inline void Solver::Swap(double** &v1, double** &v2) 
{ 
    double** vswap = v2; 
    v2 = v1; 
    v1 = vswap; 
} 

그러나 std::swap()을 사용하지 않으시겠습니까?

+0

실제로 std :: swap ...을 알지 못했습니다. (oops) 플러스에서는 두 속도가 같은 속도로 수행됩니다. 나를 가리키는 타이 std :: swap – ccook

0

7 %는이 작업이 느리다는 것을 전제로하지 마십시오. 무엇이 이고 다른 하나는일까요?

1 나노초 걸리는 작업을 수행하고 거의 아무것도하지 않음으로써 거의 100 % 시간이 걸리게 할 수 있습니다.

관련 문제