티스토리 뷰

======================================================

안녕하세요, Doridori입니다.

매번 글을 쓰면서 느끼는 것이지만, 인사말에는 늘 프로젝트 이야기가 빠지지 않는 것 같습니다. 그만큼 쉬운 프로젝트는 세상에 없다는 걸 매번 느끼곤 합니다. 이번 프로젝트 역시 쉽지 않지만, 몸과 마음이 꺾이지 않도록 스스로 다잡으며 하루하루 노력하고 있습니다.

얼마 전 블로그에 북한산과 수락산을 다녀온 글을 올렸는데요, 다녀온 후 무릎 상태가 좋지 않다는 걸 느껴 무리한 등산 대신 요즘은 자전거를 타며 새로운 방식으로 건강을 챙기고 있습니다. 몸이 지치지 않아야 마음도 흔들리지 않는다는 걸 요즘 다시금 느끼고 있습니다.

열심히 지내다 보면 분명히 좋은 날이 다시 찾아올 것이라 믿습니다. 그래서 오늘도 묵묵히 제 길을 걸어가고 있습니다.

최근 즐거웠던 일로는 회사 워크샵을 다녀온 경험이 있습니다. 제 직급 정도 되면 주로 고객사나 관리 부서 분들과 인사를 나누게 되는데, 이번에는 평소에 잘 몰랐던 여러 동료들과 교류할 수 있어 뜻깊은 시간이었습니다. 새로운 인연을 만나고 서로 다른 이야기를 나눌 수 있어 참 즐거운 시간이었습니다.

지금 이 순간에도 각자의 자리에서 최선을 다하고 있는 모든 분들을 응원합니다.

우리 모두 화이팅입니다!

감사합니다. ^^

======================================================

 

76. 프로그램 성능 개선

Soruce)

76. 프로그램 성능 개선 [01. 성능개선 전].zip
0.25MB
76. 프로그램 성능 개선 [02. 성능개선 후].zip
0.56MB

교재)

76. 프로그램 성능 개선.pdf
0.26MB

 

 

간만에 프로그램 소스를 가지고 진행 한 C# 강의 인 듯 합니다. ^^a

제가 출장을 다닐 때 꼭 지하철을 타러 가는 다리 위에서 사진을 장소에서 찍어서 가지고 있는데 이걸 한번 모아서 연결 시켜 볼까 생각을 하고 있었습니다. 

그래서 동일한 장소에서 찍은 사진을 필터 할만한 방법이 있을까 찾아보고 있는데 옆에 있던 회사 동료가 '하나 만드세요. 그럴려고 개발자 하는거 아닙니까' 라고 하시는데 그것도 그렇네 싶어서 한번 만들었습니다. ㅎ

사진에 있는 GPS 좌표와 프로그램에 설정 한 위도, 경도를 가지고 범위 안에 있는 사진을 대상 폴더로 복사해서 모아주는 프로그램 입니다. ^^ 나쁘지 않네요. ㅎㅎ마

만들고 나니 속도가 느려서 개선하는 부분들을 고민하고 완성하고 나서는 이 내용을 공유해도 좋겠다 싶어서 자료로 정리하게 되었습니다. ^^b

---------------------------------------------------------------------------------------------------------------------------------------------------

 1. 개요

   > 사진들 중 특정 장소에서 찍은 사진을 분류 (장소는 동일, 날짜는 다름)

   > 사진의 메타데이터 중 위치 정보를 가지고 범위 내에서 찍은 사진을 분류

 2. 프로그램의 기능 및 개발

   a. 기능

      > 사진을 불러올 폴더 (하위 폴더 포함)

      > 찾은 사진을 모아서 저장 할 폴더

      > 위도, 경도, 범위 지정

   b. 개발 및 테스트

      > 기본 기능에 대해 정상 동작 확인

      > 많은 양의 사진 작업 시 진행 상황 확인 필요

        à  Progress 추가: 전체 수량 및 진행 수량 상태 및 로그 표시

 3. 1차 결과

   > 기능에 대한 만족도는 높으나 약 8000개 정도의 사진에 대해 작업을 진행 할 경우 많은 작업 시간이 소요 됨

 4. 성능 개선에 대한 분석(속도 이슈에 대한 내용 검토)

   a. 이미지를 하나씩 열어 GPS 정보를 확인

   b. Image.FromFile()은 디스크 I/O 비용이 크고 이미지 전체를 메모리에 로딩하기 때문에 매우 느림

 5. 개선 방향

   a. 병렬 처리 로직 적용: Parallel.ForEach 사용

     > CPU의 코어를 활용하여 여러 파일을 동시에 작업

     > 주의: UI 접근은 Invoke를 사용하거나 UI 쓰레드 외에서 하면 안됨

   b. 이미지 전체 로딩 없이 EXIF만 읽기

     > MetadataExtractor 사용

        : 이미지 전체를 로딩 하지 않고 메타데이터만 추출

     > NuGet Package 설치: Install-Package MetadataExtractor

   c. (추가작업) UI 스레드 분리: 비동기/백그라운드 작업(async/await, button Interlock )

 6. 예상 성능: 100배의 성능 증가가 기대 됨

처리 방법 장당 처리 속도 계산 예상 결과
Image.FromFile 100~300ms 150ms * 8000= 1200 20
Parallel문 사용 100~300ms 1200÷ 6(코어 수) = 200 4
MetadataExtractor 5~20ms 15ms * 8000= 120 2
Parallel + MetadataExtractor 5~20ms 120÷ 6(코어 수) = 20 20

 7. 성능 확인

   a. 이미지 83개 기준 Test(대상 이미지 1)

처리 방법 결과
Image.FromFile 9
Parallel문 사용 5
Parallel + MetadataExtractor 3

 8. 결과에 대한 분석

   a. 테스트 대상 사진 수의 차이 (예측: 8000vs 실제: 83)

     > I/O 및 스레드 준비에 들어가는 고정 비용(fixed overhead)의 차이

   b. 이미지 크기 및 구조 단순화

     > 이미지 크기에 따라 속도 차이

   c. 디스크 I/O 속도 차이

     > SSD, 메모리등 실행 환경에 따라 파일 접근 속도의 차이가 남

   d. 병렬 처리 효과: 실제 CPU 스케줄링의 차이

     > 단순 예측에 비해 실제 OS 스케줄러 성능이 더 효율적 일 수 있음

   e. 처리 대상이 단 1개였음 (83장 중 1개만 복사)

     > 복사 할 대상 파일을 검색 후 파일 복사 까지의 시간 소요의 차이

 환경에 따른 성능 차이가 크기 때문에 실제와 비슷한 조건에서 테스트를 진행 하는 것이 중요함

---------------------------------------------------------------------------------------------------------------------------------------------------

강의)

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함