2011-08-04 3 views
2

나는이 작은 조각의 코드에서 작업하고 있지만 예상대로 작동하지만 최적화해야합니다. 나에게 몇 가지 아이디어를 제안 해주세요.이 코드를 최적화 할 수있는 방법이 있습니까?

여기 내 코드의 중요한 부분입니다 :

std::replace_if(inputImage,inputImage+ m_xDim*m_yDim*m_zDim, bind2nd(std::less<float>(), 0), 0); // replace the values <0 with 0 of array input 

std::replace_if(inputImage,inputImage+ m_xDim*m_yDim*m_zDim, bind2nd(std::greater<float>(), 4095), 4095); // replace the values >4095 with 4095 of array input 

당신은 내가 inputImage의 값이 범위를 [0,4095]에 함께 할 수 있도록입니다 볼 수 있듯이. 그러나 이것이 효율적인 코드가 아니라는 것은 명백합니다. 루프를 실행하고 한 번에 두 작업을 수행 할 수 있습니다. 그러나 C++이 아닌 C 스타일이됩니다.

replace_if을 사용하여 한 번에 두 가지 작업을 수행 할 수 있습니까? 당신이 최적화해야하는 경우

+1

transform을 사용할 수 있으며, "모양 ++ C"는 주장은 더 이상 없습니다. – moala

+0

@ 모아라 : 완전히 동의하지 않습니다. 추한 원시 반복자 코드가 필요하기 때문에 최적화 할 필요가 없습니다. C++ 스타일은 스스로 할 수있는 것보다 훨씬 더 최적화 될 가능성이 매우 높습니다. 이는 올바른 도구를 선택하는 문제입니다 (답변에 잘 표시되어 있음). – KillianDS

+0

@KillianDS : 각 작업에 대한 도구가 없으며 때로는 자신 만의 작업 전용 도구를 만들어야합니다. – moala

답변

1

당신은 항상 : 즉, 적절한 변압기,

struct Clipper 
{ 
    int operator()(int in) const 
    { 
     return in < 0 ? 0 : 4096 < in ? 4095 : in; 
    } 
}; 
+0

읽을 수 없습니다 – KillianDS

+0

@KillianDS : if()로 작성했을 수도 있지만 <0에있는 대문자는 0보다 큰 경우 std :: min (std :: max (0, value), 4096)보다 더 최적화 될 수 있습니다 두 번째 비교를 실행하지 마십시오. 프로세싱 유닛의 브랜치 예측이 글로벌 태스크 성능을 방해 할 수 있기 때문입니다. – moala

+0

@ 모아라 : 저는 구현에 대해 불평하지 않았습니다. 좋은 imho입니다.()의 부족에 관한 것입니다. – KillianDS

4
float clip(float value) { 
    return std::min(std::max(0, value), 4096); 
} 

int size = m_xDim * m_yDim * m_zDim; 
std::transform(inputImage, inputImage + size, inputImage, clip); 
관련 문제