C#.NET Q&A

[RE] for문과 foreach문의 속도차이 소프 평점: 없음 조회: 10491
오래 된 질문 글이지만..
저도 검색하다보니 이런 글이 있어서 남겨봅니다.
뭐.. 제가 쓴건 아니고 저도 찾아본 내용이니.. 객관적인 시선으로 보시고 검증 해 보셔서 판단해 보세요~^^
 
출처 : http://steelleg.tistory.com/256
(위 출처에서 가져왔는데.. 그 분께서 아래 출처에서 가져오셨나봐요~^^)
 
---------------------------------------------------------------------------------------------------------------------------------------------
 
출처 :http://www.hoons.kr/Board.aspx?Name=cshaptip&Mode=2&BoardIdx=17191&Key=&Value=



using (Image img = Image.FromFile(filePath))

{

    for (int x = 0; x < img.Width; x++)

    {

        for (int y = 0; y < img.Height; y++)

        {

            //Do something

        }

    }

}


위의 코드를 살펴보자.

여기서 using 은 using 안에서 생성한 오브젝트가 유효한 범위를 말한다.
즉 using 이 끝나는 시점에서 생성한 오브젝트의 dispose() 가 호출된다.(물론 이 객체는 IDispose 인터페이스를 구현하고 있어야 한다)

여기서 유심히 볼 부분은 for 문인데, 루프 한번 돌때 마다 아래와 같은 작업이 일어난다.

1. x < Image.Width 검사
2. 이미지 객체 참조
3. Width 속성이 있는지 검사
4. Width 값 읽기
5. Width 값 리턴
6. 루프 계속 진행

위의 단계를 줄여 속도를 높인 코드가 아래 있다.


using (Image img = Image.FromFile(filePath))

{

    int width = img.Width;

    int height = img.Height;

    for (int x = 0; x < width; x++)

    {

        for (int y = 0; y < height; y++)

        {

            //Do something

        }

    }

}




오브젝트 array 를 다룰 때도 마찬가지다. 아래처럼 쓰는 것이 더 빠르다.


SomeObject[] objList = new SomeObject[1000];

int count = objList.Length;

for (int i = 0; i < count; i++)

{

    SomeObject obj = objList[i];

    //Do something

}




그런데...foreach 는 어떨까?


foreach (SomeObject obj in objList)

{

    //Do something

}


foreach 가 더 빠를 것 같지만 사실 그렇지 않다. for 를 사용하고 그 길이를 변수에 저장하고 내부에서 casting 해서 사용하는 것이 더 빠르다.


여기서...갑자기 궁금해서 검색을 해봤더니 http://www.madprops.org/blog/for-vs-foreach-performance/ 이 글에서 테스트를 했다. 약 3배차이가 났다...오우


한번 쯤 이런 실수들을 해봤을 것이다.
아래는 리스트를 비우는 코드다.


List<SomeObject> objList = new List<SomeObject>();

//Add object to list

int count = objList.Count;

for (int i = 0; i < count; i++)

{

    objList.RemoveAt(i);

}



하지만 이 코드는 에러가 난다.
하나의 리스트 항목을 삭제하면 objList.Count 값이 매번 달라지기 때문에 i 가 인덱스 하는 범위가 Count 의 범위를 넘어선다.

그래서 거꾸로 루프를 돌아야 한다.


List<SomeObject> objList = new List<SomeObject>();

//Add object to list

int count = objList.Count;

for (int i = count - 1; i > 0; I--)

{

    objList.RemoveAt(i);

}



다른 좋은 방법이 있다.


while (objList.Count > 0)

{

    objList.RemoveAt(0);

}



위의 루프에서는 objList.Count 에 매번 접근하고 있다. 이글의 맨처음에 언급한 내용에 따르면
이 루프는 느리다. 그래도 보다 안정적이다. 이 코드는 어느경우에서든 리스트를 깨끗히 비워준다.


태그 : 속도 for foreach
작성자 정보
소프
Level 3
 [EXP.13/16]

메일:  비공개
글등록 +12 36 덧글등록 +3 0
자기소개
안녕하세요~ 개발 업무 하면서 이번에 ASP.NET 을 사용하는 웹팀으로 옮기게 되어 정보 찾아 헤메는 중 "아~~ 이렇게 좋은 곳도 있구나~" 하면서 가입하게 되었습니다.~^^ 소개랄건 별거 없고 웹개발 초보라고 소개할 것 밖에는 없군요~^^* 스노우 보드 좋아해서 이번에도 휘팍에 시즌권을 샀다는.. 최근 소식 하나 더 추가하고요~ㅎㅎ 나중에.. 이 자기소개글을 잊고 있다 몇 년 후 보면서.. 아~ 그 때는 정말 아무것도 몰랐었지 하면서 회상하는 날이 빨리 오기를 바라며...^^
글 공유하기 |
  tweet facebook
2010-04-20 오전 10:55:04
나도한마디
태그로 엮인글
[C#.NET Q&A] c# 병렬처리 질문[1]  윈드찡
[C#.NET Q&A] foreach 문을 for 문으로 변경하고 싶습니다.[1]  insurang
[C#.NET Q&A] for 문에서 간단하 로직 질문드려요.[1]  키쿄쿄쿄키쿗
[C#.NET Q&A] c# for문 동작중 하나씩 표현하고 싶습니다.[2]+2  Line
[C#.NET Q&A] c# 리스트에 새로운 데이터 Add할때  엘리엇
[C#.NET Q&A] textbox나 label 의 text 값을 for 문으로 입력 받고 싶습니다..[2]+2  d20121201
[C#.NET Q&A] c# 프로그램으로 mysql db 저장중 mysql 문의  필승불패
[C#.NET Q&A] IndexOutOfRangeException 질문드립니다.[1]+1 파일첨부 슈비
[C#.NET Q&A] Visual Studio 단축키 질문[1]  이쿠욧
[C#.NET Q&A] 메소드로 생성한 데이터 테이블을 데이터 셋에 담는 방법이 있을까요[3]+9  가리워진길
글리스트
[RE][RE]DataSet은 멀티 레코드셋 지원 안하나요?  김종영
smartclient+propertygrid 문제입니다 ㅠ,.ㅜ[3]  김현석
[RE]smartclient+propertygrid 문제입니다 ㅠ,.ㅜ(예제소스)  김현석
progressBar 사용법좀 ㅡ.,ㅜ [1]  김훈철
[RE]음... ㅡ_ㅡ)일단 ㅡ,.ㅡ대충???   김훈철
강좌 보던중 문자를 유니코드로 바꾸는 법은요?[2]  신명준
^^ 자료실에 있는 역컴파일러 방지 프로그램 사용법에 대해 알려주세요.  장원석
[RE]^^ 자료실에 있는 역컴파일러 방지 프로그램 사용법에 대해 알려주세요.  HOONS
Item 속성  Lee
for문과 foreach문의 속도차이  Lee
 ★현재글->   [RE] for문과 foreach문의 속도차이  소프
[RE] for문과 foreach문의 속도차이  소프
[RE]for문과 foreach문의 속도차이  김수영
11장. 데이터베이스 접속에러?[2]  방준호
고급강좌 마우스 이벤트 관련 부분에서 ButtonUp효과가 잘 안되네요  araunae
[RE]고급강좌 마우스 이벤트 관련 부분에서 ButtonUp효과가 잘 안되네요  HOONS
[RE][RE]고급강좌 마우스 이벤트 관련 부분에서 ButtonUp효과가 잘 안되네요  서동진
ADO.NET OUTPUT 파라메터값 받기 어떻게 하나요?[2]  김종영
[RE]ADO.NET OUTPUT 파라메터값 받기 어떻게 하나요?  서동진
[RE][RE]ADO.NET OUTPUT 파라메터값 받기 어떻게 하나요?  김종영
[RE][RE][RE]ADO.NET OUTPUT 파라메터값 받기 어떻게 하나요?  HOONS