[Archive] 강좌게시판

취소
다음에 대한 결과 표시 
다음에 대한 검색 
다음을 의미합니까? 

[myLV.net 집필진 강좌] 속도 최적화하기

 [myLV.net 집필진 강좌 – Goodmaner]

 

이번 강좌에서는 LabVIEW에서 속도를 최적화하는 방법에 대해서 설명하도록 하겠습니다. 이전 강좌에서도 언급했듯이 속도와 메모리는 trade-off가 있어서 구현하고자 하는 프로그램의 특성에 맞도록 최적화 작업을 진행해야 합니다. 지금부터 여러가지 방법의 속도 최적화 방법을 함께 알아보도록 하겠습니다.
 
우선 UI에 값을 업데이트하는 방법에 따른 속도 차이를 살펴보겠습니다.
컨트롤 값을 인디케이터에 값을 업데이트하는 방법은 아래와 같이 3가지가 있습니다.
 
1.터미널에 직접 연결
2.로컬 변수에 연결
3.프로퍼티 노드에 연결
 
3가지 방법들에 대해 속도가 빠른 순서는 터미널 > 로컬 변수 > 프로퍼티 노드입니다.
가장 좋은 방법은 직접 터미널에 연결하는 방법이며, 여의치 않은 경우에는 로컬 변수나 프로퍼티 노드를 사용해야 하는데, 속도 최적화가 필요하면 로컬 변수를, 메모리 최적화가 필요하면 프로퍼티 노드를 사용하면 됩니다.
프로퍼티 노드 중 "Defer Panel Updates"가 있는데, 여러 컨트롤 속성을 변경할 때 사용하면 속도를 개선시킬 수 있습니다. 
아래와 같이 tree 컨트롤에 인보크 노드로 "Edit Tree Items>>Add Item to End"를 사용하여 For Loop를 100번 수행하는 경우 "Defer Panel Updates"를 사용하는 경우에는 컴퓨터 사양에 따라 차이가 있는데, 대략 수행하는데 걸리는 시간이 40% 정도 감소되는 효과가 있습니다.

1.png

 

2.png

 

코딩을 효율적으로 운영하기 위해 여러 개의 컨트롤들을 기능 별로 묶어서 클러스터로 운영하는데, 이런 경우 wiring은 편하지만 속도는 느려집니다.
UI를 간단하게 운영하면서 컨트롤들과 인디케이터들을 겹치지 않도록 운영하면, 속도를 개선시키는 효과가 있습니다.
Iteration 속도나 기능을 고려하여 여러 개의 Task를 병렬로 운영하면 속도를 개선시킬 수 있습니다.
아래 그림에서와 같이 VI 속성을 "Allow debugging" 및 "Enable Automatic Error Handling" 옵션을 해제하면 속도가 개선됩니다. 즉, 에러에 대해서 핸들링이 가능하면 수동으로 처리하면 좋습니다. 
Main VI에서 Sub VI를 호출해서 운영하는 경우 Sub VI 특성 옵션에서 "Inline subVI into calling VIs"를 설정하면 Sub VI가 호출될때 발생하는 overhead를 줄일 수 있습니다.
 
3.png

 

두 개의 1차원 배열에 대해 원소 별로 더하기를 하는 코드를 구현할 때 아래 그림에서처럼 두 가지 형식으로 구현할 수 있는데, For Loop를 이용해서 구현하는 것보다 더하기 함수의 입력으로 배열을 바로 연결해서 구현하면 속도가 개선됩니다.
4.png

 

5.png

 

Loop 안에 불필요한 코드가 수행되지 않도록 합니다. 예를 들어서 파일을 열어서 텍스트로 저장하는 경우 File Open/Close는 While Loop 밖에서 수행하도록 하면 속도를 개선시킬 수 있습니다.

6.png

기여자