본 문서는
1. 즉시 처리 방식과 일괄 처리 방식 비교
2. SmartFile에서의 일괄 처리
3. SmartDraw에서의 일괄 처리
4. 일괄 처리에 따른 처리 시간 비교
순서로 진행합니다.
자료가 발생하면 즉시 처리하는 즉시 처리 방식과는 달리, 계속해서 발생하는 자료를 축적하여 두었다가
일정 시점 또는 일정량이 축적되었을 때 일괄해서 처리하는 자료 처리 방식입니다.
특히 시스템에서 한 번만 처리해도 유효한 공통적인 작업을 반복적으로 처리하게 되는 경우 오버헤드가
발생하여 시스템의 처리 속도가 느려지는 문제점이 발생합니다. 이때 프로그램에 일괄 처리 방식을 적용
할 경우, 오버헤드가 줄어들고 시스템의 성능이 향상되는 이점이 있습니다. 따라서 즉시 처리 방식은 항상
최신의 데이터를 유지해야 하거나 이용자가 즉시 응답을 받아야 하는 경우에 사용되고, 일괄 처리 방식은
공통적인 처리를 여러 번 반복하는 작업을 한 번만 처리하게 하여 시스템의 성능을 향상시키기 위해 사용합니다.
SmartX Framework의 컴포넌트 중에서 데이터를 처리하는 방법이 즉시 처리와 일괄 처리 방식으로
나눠지는 컴포넌트로는 SmartListBox와 SmartDraw이 있습니다.
즉시 처리 | 일괄 처리 | |
---|---|---|
장점 | 데이터의 실시간성이 보장됨 |
오버헤드가 줄어들기 때문에 시스템의 성능 향상을 기대할 수 있음 |
단점 |
한 번만 처리해도 되는 공통적인 작업을 반복적으로 처리하는 경우 오버헤드가 발생하여 시스템의 처리 속도가 느려짐 |
데이터의 실시간성을 보장하기 어려움 |
SmartFile |
Write() Read() |
FillBuffer() WriteBuffer()/WriteBufferSave() ReadBuffer() |
SmartDraw |
DrawUpdateOption = DefaultAuto (※ Application.DoEvents()) |
DrawUpdateOption = BatchAssign DrawUpdate() |
2. SmartFile에서의 일괄 처리
SmartFile은 데이터를 Write/Read하는 시점으로 메소드를 분류할 수 있습니다. 구조체(Structure)의 경우 String과 사용법이 크게 다르지 않아 본 문서는 String을 기준으로 안내합니다.
1) Write() : 즉시 처리 방식으로, 데이터를 물리적인 저장소에 Write합니다.
2) FillBuffer() : 일괄 처리 방식을 사용하기 전 물리적인 저장소에 데이터가 있는 경우 Buffer로 데이터를 읽어옵니다.
3) WriteBuffer()/WriteBufferSave() : 일괄 처리 방식으로, WriteBuffer()를 호출해 데이터를 RAM(Buffer)에 저장 후 마지막에 WriteBufferSave()를 호출해 일괄로 물리적인 저장소에 Write합니다.
4) Read() : 즉시 처리 방식으로, 저장소의 데이터를 Read합니다.
5) ReadBuffer() : 일괄 처리 방식으로, FillBuffer()를 호출해 저장소의 데이터를 Buffer로 Read한 뒤 ReadBuffer() 메소드를 호출해 데이터를 일괄적으로 Read합니다.
Writing 중 프로그램 오류가 발생하거나 전원 공급이 불안정해지는 등 오류가 발생하는 경우 파일이 깨지거나 데이터의 손실이 발생할 수 있습니다. 또한, SmartFile을 이용하여 File을 쓰는 경우 저장소에 물리적으로 Writing하기 때문에 빈번하게 Write하는 경우 저장소 성능의 저하가 발생합니다.
Write() |
WriteBuffer() WriteBufferSave() |
|
---|---|---|
장점 | Write중 오류가 발생하는 경우 오류 발생 직전까지의 데이터를 Write합니다. |
대량의 데이터를 Write하는 경우 Write()과 비교하여 시스템의 성능 향상을 기대할 수 있고 저장소 성능의 저하를 방지할 수 있습니다. |
단점 | 호출 시마다 물리적 저장소(SD Card, Flash Disk)에 저장하므로 여러 번 호출할 경우 오버헤드가 많이 발생하여 처리 시간이 늘어나고, 저장소 성능의 저하가 발생합니다. |
WriteBuffer()을 호출하고
WriteBufferSave()를 호출하지 않은 상태에서 프로그램 오류 또는 전원 공급이 중단되는 등의 오류가 발생한다면 데이터의 손실이 발생합니다. |
3. SmartDraw에서의 일괄 처리
SmartDraw는 DrawUpdateOption 속성을 설정하여 즉시 처리, 일괄 처리를 선택할 수 있습니다.
1) DrawUpdateOption = DefaultAuto : 즉시 처리 방식으로, Draw관련 메서드가 호출되었을 때 즉시 화면에 표시합니다.
2) DrawUpdateOption = BatchAssign : 일괄 처리 방식으로, Draw관련 메서드가 호출되어도 화면에 표시하지 않습니다. DrawUpdate() 메서드를 호출하면 화면에 일괄적으로 표시합니다.
반복문 안에서 SmartDraw의 Draw 관련 메서드를 사용하여 일괄적으로 처리할 때 New버전의 경우에는 Old 버전과 다르게 OnPaintMessage가 발생하지 않아서 그리는 중간에 화면이 갱신되지 않습니다.
예를 들어 버튼을 클릭하여 500개의 사각형을 반복문으로 그릴 때 New 버전에서는 500개의 사각형이 하나하나 그려질 때 마다 화면 갱신을 하는 것이 아닌 최종적으로 500개가 끝나고 나면 그때 Message들이 다 Loop에서 처리가 되고나서 화면이 갱신됩니다. 이것을 강제적으로 사각형마다 처리하기 위해서는 Application.DoEvents() 메서드를 추가해야 합니다.
이러한 이유로 인해 기본적으로 New버전의 SmartDraw는 즉시 처리와 일괄 처리의 속도가 많은 차이가 발생하지 않지만 Old 버전과 비교했을 때 더 빠르게 그릴 수 있다는 것을 확인할 수 있습니다.
4. 일괄 처리에 따른 처리 시간 비교 [표] 각 메소드 반복 호출 횟수별 소요 시간 (단위 : 초)
컴포넌트 | 인터페이스 | 처리 방식 | 500번 | 5,000번 | 10,000번 |
---|---|---|---|---|---|
SmartDraw | DefaultAuto | 즉시 처리 | 0.209 | 1.905 | 3.820 |
DefaultAuto + DoEvents() | 즉시 처리 | 0.778 | 7.749 | 15.515 | |
BatchAssign | 일괄 처리 | 0.122 | 1.204 | 2.393 | |
SmartFile | Write() | 즉시 처리 | 1.344 | 13.736 | 27.517 |
WriteBuffer() WriteBufferSave() |
일괄 처리 | 0.065 | 0.419 | 0.764 | |
Read() | 즉시 처리 | 2.817 | 349.237 | 1490.233 | |
FillBuffer() ReadBuffer() |
일괄 처리 | 0.007 | 0.122 | 0.182 |