본문 바로가기

Programming/Tasker 프로필/프로젝트

Tasker의 일반 액션보다 JavaScriptlet 으로 구현 하는 것이 속도가 빠르다.

task - script 에 보면 JavaScriptlet 이 있습니다. 







여기서 돋보기 아이콘을 클릭 해보면 Tasker의 대부분의 액션들이 함수로 제공 되는데, 실험결과 그냥 Tasker로 만든 순차 액션들의 실행보다 이 JavaScriptlet에 있는 동일한 기능의 함수로 실행 하는 것이 속도가 같거나 더 빠르네요. 





원래 속도자체가 빠르지만 특히 Tasker의 여러 순차 실행 액션을 모두 하나의 JavaScriptlet 안에 넣는 경우에는 속도가 더 빨라지는듯 합니다.
예를 들자면 일반적으로 Tasker의 프로파일을 구현 할 때 

1.flash - 테스트
2.Variable set - %arr, 가;나;다;라;마;바;사
3.Variable split - %arr, ;
4.Variable set - %i, 1
5.flash - %arr(%i)
6.Variable add - %i, 1
7.go to - 5, if %i < 8

의 task를 만들 경우 goto 문을 이용하여 loop문이 돌게 되는데 이럴 경우 Tasker는 속도가 꽤 느린 편입니다.
하지만 JavaScriptlet으로 만들면

1.JavaScriptlet - flash('테스트'); var tmp='가;나;다;라;마;바;사'; var arr = tmp.split(';'); for(i=0;i<arr.length;i++) flash(arr[i]); 

로 task 자체의 순차 실행도 하나만 될 뿐아니라(물론 script내에서는 여러 함수 및 구문이 실행 되지만요...) loop문 도는 속도도 월등히 빠르네요. 게다가 일반 Tasker의 액션에 있는 Variable split으로는 엔터에 의해 줄이 나눠진 것을 나눌 수 없는 것으로 알고 있습니다. 
예를 들자면,

가나다라마바사
아자타카타파하
ABCDEFG

를 Variable split으로 {가나다라마바사}, {아자차카타파하}, {ABCDEFG}로 나눌 수 없지요. 
하지만 JavaScriptlet은 스크립트 언어 형태이기 때문에 \n 으로 가능 합니다.
 -> var tmp = '가나다라마바사
아자타카타파하
ABCDEFG';
tmp.split('\n');으로 해당 기능이 구현 가능 합니다.

하지만 단점도 있습니다.
JavaScriptlet 과 일반 task사이에서 지역 변수와 전역 변수, 지역변수 배열이 교환 가능하기는 합니다. 하지만 전역 변수 배열은 교환이 불가능 한 것 같습니다. 
지역변수는 일반 액션에서는 %를 붙여서 쓰지만, JavaScriptlet에서 이를 쓸 때는 %없이 쓰시면 됩니다.
전역 변수는 gloabl()함수와 setGlobal() 함수를 이용 하셔야 합니다. -> 이는 UserGuide를 참고하시면 됩니다.
지역 배열은 역시 지역 변수처럼 그냥 쓸 수 있습니다. 단, 스크립트 언어 내에서는 배열 인덱스를 나타낼때 대괄호([])로 나타내며 시작이 0 부터 입니다.
(예, 일반 액션의 배열변수의 첫번째 원소 : %arr1 또는 %aff(1) / 스크립트에서의 배열변수의 첫번째 원소 : arr[0] )
전역 배열은 서로 교환이 불가능 한듯 한데 한가지 꼼수가 있기는 합니다.
스크립트 내에서 어떤 변수 배열 var arr=[]; for(i=0;i<10;i++) arr[i] = i; 를 Tasker의 전역 변수로 넘기고 싶다면, 스크립트 내에서 이를 join하여 하나의 지역 변수로 만든 후 이 지역변수 하나를 전역 변수로 넘겨주고 일반 Tasker 액션에서 이 전역변수를 split 하는 겁니다. 
(예, 스크립트 내에서 var tmp = arr.join(';'); setGlobal('TEMP', tmp); 를 한 후 일반 액션에서 Variable split - %TEMP, ;  를 하시면 됩니다. )
이런 방식으로 listFiles액션 까지 모두 JavaScriptlet으로 하여 파일 탐색기를 구현 하였을 때 Tasker의 일반 액션들만으로 구현 한 것보다 훨씬 속도가 빠르네요. 특히 루프문이 있거나 file list등에서 월등 한 것 같습니다.(새로 구현 된 파일 탐색기)





(전의 느린 파일 탐색기) - 이 링크는 제가 예전에 올린 파일 선택기 예제 인데 Tasker의 일반 액션들로만 구현 되어 있어서 sdcard내에 파일이 많을 경우 속도가 엄청 느립니다.)

Tasker의 모든 액션이 JavaScriptlet에 함수로 구현 되어 있지는 않는듯 합니다. 하지만 왠만한것은 대부분 있는 것 같더군요.

참고로, script - JavaScript에서 돋보기 아이콘을 눌렀을 때 나오는 함수 리스트를 보는 방법은 이렇습니다.
listFiles 함수를 예로 들자면
listFiles[str files](str path, bool hidden) 
이라고 써 있는데 함수 이름에서 알 수 있듯이 어떤 경로의 파일을 나열하는 Tasker의 List Files 액션과 동등한 역할을 합니다. 이때 대 괄호([]) 안에 있는 것은 반환 값입니다. 문자열(string) 형태로 반환하므로 변수에 넣고 쓰시면 됩니다. 소괄호(()) 안에 있는 것은 매개 변수 입니다. path는 경로 문자열 이며 bool hidden은 true 또는 false값을 갖는 boolean 값으로 숨겨진 파일도 나타낼지 말지를 결정 합니다.
그러므로 sdcard 경로에 있는 숨겨진 파일 외의 모든 파일을 출력 하고 싶다면 var f = listFiles('/sdcard' , true); 를 하시면 변수 f 에 /sdcard 경로 내의 모든 파일 및 폴더가 개행문자(\n)를 기준으로 들어갑니다. 이 때 Tasker의 일반 List Files 액션과 다른 점은 Tasker의 일반 List Files 액션은 배열에 하나씩 저장 하는 반면 JavaScriptlet의 함수는 변수 하나에 개행문자를 기준으로 넣는다는 것입니다. 그러므로 일반 Tasker액션의 ListFiles는 반환값으로 %files를 줬다면 %files1 = /sdcard/첫번재 폴더, %files2 = /sdcard/두번째 폴더..... 이런식으로 들어가는 반면, JavaScriptlet은 
var f = /sdcard/첫번째 폴더
/sdcard/두번재 폴더...

이런 식으로 들어가므로 f.split('\n');으로 split해서 써야 하지만 이럼에도 속도가 월등히 빠릅니다.