July 6th, 2010
Scriptroid - easy android framework tester using Beanshell


Beanshell에 초간단 UI입혀놨습니다.
android API 테스트를 위해 프로그램을 작성해 올릴 필요 없습니다.
activity라는 내장 변수가 선언되어 있으니 이를 통해 Context나 Window따위에 접근할 수 있습니다.
ASE(Android Scripting Environment)가 있지 않느냐?’ 는 질문이 있을 수있는데 그들이 지원하는 API는 극히 제한되고 별개의 것이어서 app 개발 하는데 도움이 크게 안됩니다.

Beanshell을 선택한 이유는 Dalvik은 동적으로 bytecode를 생성해서 실행시키는 류의 스크립트는 구현이 불가능하기 때문입니다. 이런 순수 interpreter 방식의 JVM language가 어떤게 또 있는지는 모르겠습니다(찾아보기도 구찮어..T_T)

APK Download

토론토로 향하는 인천공항에서..T_T

July 1st, 2010
Exception과 Performance

정상적인 로직에 exception을 활용하면 성능이 황이라는건 공부 조금 하면 나오는 이야기다. (하지만 모르는 개발자랑 일 할기회도 있다 ^^)

이론은 잘 모르고 간단한 실험 결과만 보자.

일단 VM정보. 글구 장비는 흰 싸구려 맥북이다.
java version "1.5.0_24"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_24-b02-357-9M3165)
Java HotSpot(TM) Client VM (build 1.5.0_24-149, mixed mode, sharing)

예제는 간단하다. 그냥 object를 100만개 만들고 시간잰다.

JAVA:
  1. public class ExceptionTest1 {
  2.     public static void main(String... args) {
  3.         long before = System.currentTimeMillis();
  4.         for(int i=0;i<1000000;i++) {
  5.             Object o = new Object();   
  6.         }
  7.         long after = System.currentTimeMillis();
  8.         System.out.println("Diff : "+(after-before)/1000.0);
  9.     }
  10. }

결과 (단위:초)
Diff : 0.013

이번엔 Object대신 Exception 객체를 만든다.

JAVA:
  1. public class ExceptionTest2 {
  2.     public static void main(String... args) {
  3.         long before = System.currentTimeMillis();
  4.         for(int i=0;i<1000000;i++) {
  5.             Exception e = new Exception();
  6.         }
  7.         long after = System.currentTimeMillis();
  8.         System.out.println("Diff : "+(after-before)/1000.0);
  9.     }
  10. }

Diff : 1.371
이 예에서는 한 100배 느렸다. 성능저하의 핵심은 Throwable의 생성자에서 fillStackTrace() 호출에 있다.

이 정도도 만족 못하고 더 느리게 만들고 싶으면 I/O를 유발시키면 된다. 흔히 하는 짓이지만 printStackTrace()를 호출을 추가하면 만족할 수 있을것이다.(여기서는 그냥 stderr에 찍도록 코딩되어있고 local ternimal로 출력)
Diff : 49.082
Exception을 생성하기만 하는 예제보다 35배 정도 느려졌다.