다음과 같은 코드가 있습니다.
void function(int parameter)
{
for( ... ) // a big loop
{
double a = ...;
for( ... ) // a big loop
{
double b = ...;
double value;
if(parameter == 1)
value = some_math_expression_1(a, b);
else if(parameter == 2)
value = some_math_expression_2(a, b);
...
}
}
}
아이디어는 매개 변수에 따라 몇 가지 수학 표현식을 a
및 에 적용하려는 것 b
입니다. 이 함수는 여러 번 실행되고 빠르며, 각 반복에서 이러한 조건부 분기가 내가 절약 할 수있는 오버 헤드를 유발할 수 있는지 궁금합니다.
지금은 다음과 같은 코드를 작성했습니다.
void function(int parameter)
{
if(parameter == 1)
function1();
else if(parameter == 2)
function2();
else
...
}
모든 .NET Framework에서 코드를 반복하면 수학 표현식을 직접 적용 할 수 있습니다 functionX()
. 명백한 문제는 코드의 일부를 변경하려면 여러 번해야한다는 것입니다 (현재 약 10 개의 수학 표현식이 있습니다).
오버 헤드를 피하기 위해 어떤 방법을 사용할 수 function
있습니까?
함수 some_math_expression_X
에 대한 포인터를 function
(함수 호출에 대한 조건을 변경합니다) 전달하면 어떻게됩니까?
전체 함수를 매크로 (uf)로 코딩하고 수학 표현식을 매개 변수로 설정하면 어떻게됩니까?
템플릿을 사용하고 수학 표현식을 인라인 함수에 대한 포인터로 전달하면 어떻게 되나요?
편집 : 귀하의 답변에 감사드립니다. 나는 당신이 제안하는 방법 (포인터 / 함수 배열 또는 분기 예측 자에 의존)을 사용할 수 있다는 것을 알고 있습니다. 그러나 오버 헤드를 피하는면에서 무엇이 더 좋을지에 대한 통찰력이 있습니까? 수학 표현식은 매우 간단하며 (와 같은 a*b
) 긴 루프 외에도 function
여러 번 호출됩니다 (호출간에 분기 예측이 "생존"합니까?).
함수를 템플릿으로 변환 할 수 있습니다.
void functionT<int PARAMETER>()
{
for( ... ) // a big loop
{
double a = ...;
for( ... ) // a big loop
{
double b = ...;
double value;
if(PARAMETER == 1) //Constant condition!!!
value = some_math_expression_1(a, b);
else if(PARAMETER == 2) //Constant condition!!!
value = some_math_expression_2(a, b);
...
}
}
}
조건이 항상 참이거나 항상 거짓이므로 컴파일러는 조건 트리를 최적화하고 실제 수학 표현식 만 남겨 둡니다. 분기 및 함수 호출이 없습니다!
이제 상수 매개 변수로만 사용할 수 있습니다.
functionT<1>();
그러나 변수가 아닙니다.
int x = 1;
functionT<x>(); //Error
필요한 경우 래퍼를 만들 수 있습니다.
void function(int parameter)
{
switch (parameter)
{
case 1: functionT<1>(); break;
case 2: functionT<2>(); break;
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다