std::vector container를 Iterating하는 방법은 여러가지가 존재합니다.

평소 컨테이너 Iterating은 크게 생각하지 않고 사용하던 중
for_each에 대한 속도 향상 관련 글을 읽고 도대체 얼마나 빨라지는지 테스트를 해 보았습니다.

방법 1. None Const Iterating
std::vector< int >::iterator it     = vecInteger.begin();
std::vector< int >::iterator it_end = vecInteger.end();

for( ; it != it_end; ++it )
{
	const int& nValue = (*it);
	/* Do Something */
}
방법 2. Const Iterating
std::vector< int >::const_iterator it     = vecInteger.begin();
std::vector< int >::const_iterator it_end = vecInteger.end();

for( ; it != it_end; ++it )
{
	const int& nValue = (*it);
	/* Do Something */
}
방법 3. std::for_each( Functor )를 사용함
struct stVecInteger
{ 
	void operator() (int nElement)
	{
		const int& nValue = nElement;
		/* Do Something */
	};
} stVecIntergerFunctor;

std::for_each( vecInteger.begin(), vecInteger.end(), stVecIntergerFunctor );
방법 4. BOOST_FOREACH
BOOST_FOREACH( int nElement, vecInteger )
{
	const int& nValue = nElement;
	/* Do Something */
};
방법 5. for each(element in Container)
for each( int nElement in vecInteger )
{
	const int& nValue = nElement;
	/* Do Something */
};

Vector 컨테이너에 int 자료형을 1억개 넣고, Iterating 했을때의 결과(Release 컴파일)

Release 모드로 컴파일 했을때,
Functor가 최적화되어 어셈블리 코드가 없을때에는 0의 실행시간을 보여주는 엄청난 결과를 알게 되었다.

Functor에 별도의 수행 코드가 추가되더라도 가장 빠른 수행 성능을 보여주었다.
2010/03/01 21:32 2010/03/01 21:32

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요

  1. 올랑 2010/03/01 22:14 고유주소 고치기 답하기

    오, 아주 좋은 글이군요. 감사해요

  2. TTF 2010/03/03 10:43 고유주소 고치기 답하기

    http://cafe.naver.com/gamelong/75
    for_each 활용 예제 입니다.

  3. kalms 2010/03/03 17:44 고유주소 고치기 답하기

    functor보다 BOOST를 썼었는데 이런 엄청난 차이가... 덜덜.
    근데 5번은 어떻게 하는 거죠? 그냥 std::each 인가요?

    • 섭군 2010/03/12 12:51 고유주소 고치기

      c# 에 있던 키워드인데 c++ 에서도 되는코드군요. 문제는 레퍼런스가 아닌 단순 복사된 객체를 핸들링 하게 됩니다. 리스트의 데이터 타입이 포인터가 아닌 객체라면 for each 는 실제 컨테이너에 존재하는 객체에 대한 수정을 할 수 없습니다.

  4. frovi 2010/03/09 01:08 고유주소 고치기 답하기

    compiler에서 for문안에서 local 변수만의 대입이 일어나고 사용되지 않으면 자동 Skip합니다. 외부와 연결된 변수를 사용해 보시면 많이 다르게 나올겁니다.
    ( 단지 컴파일러의 성능 때문이라고 봅니다 )
    첫번째 방식은 for문안에서 function을 call하고, for문 밖에서 Iterator가 사용되기 때문에 skip되지 않은걸로 보입니다.

  5. 섭군 2010/03/12 12:51 고유주소 고치기 답하기

    좋은 정보 감사합니다 @_@

  6. 1억개 2010/04/20 22:35 고유주소 고치기 답하기

    1억개에 0ms 라...

  7. Dish 2010/11/10 19:50 고유주소 고치기 답하기

    1억개 0ms는 확실히 이상한데요 (...)

    frovi님 말씀처럼 Release 코드 최적화 과정에서 코드가 사라져 버려서
    제대로 결과가 안 나온 것 같습니다.