본문 바로가기

Study/Engine

Java에서 Scanner의 속도를 증가시키는 팁

※ Scanner가 그 흔히 말하는 전자기기 "스캐너"가 아님을 먼저 밝혀둡니다.

제가 이번 프로젝트를 하면서 자바에서 C의 fscanf와 같은 기능을 하는 것이 없을까 찾아보다가 알게된 클래스입니다. 자세한 정보는 여기를 클릭하시면 새창으로 안내됩니다.

그런데 이 Scanner에는 여러 메소드가 있는데, fscanf에서처럼 읽어온 파일에서 스페이스 등으로 띄어진 것



위와 같이 되있을 때, fscanf(f, "%d%d%d%d", &a, &b, &c, &d); 와 같이 받을 수 있는데, Scanner에도 이런 기능을 쓸 수 있는겁니다.

  FileHandle file = Gdx.files.internal("Songs/DARK_ENVY/DARK_ENVY{n}.nmp");
  Scanner sc = new Scanner(file.read());
  bpm = sc.nextInt();


그런데 저렇게 하게되면 문제가 발생합니다. 무진장 느려집니다. 제 예전 노트맵파일을 읽어 본 결과 (노트수 204개) 5~6초정도의 로딩시간이 걸렸습니다 (...) 정말 너무하지 않나요? 물론 안드로이드에서의 로딩속도긴 하지만, 인간적으로 너무 오래걸립니다. 원인이 뭔고 하고 찾아봤더니 저 3번째 라인이 문제였습니다. sc.nextInt() 이놈이 너무 오랜시간동안 작업을 하는 겁니다. 그래서 저녀석을 아래처럼 바꿔주면 속도가 눈에 띄게 개선됩니다.

  bpm = Integer.parseInt(sc.next());


이렇게 바꾸면 5~6초 걸리던 로딩속도가 1초대로 5배정도 빨라집니다. PC에서는 약 15ms정도 빨라지더군요. 애초에 PC에서의 204개 로딩속도는 0.1초도 안됐습니다 (...) PC와 안드로이드 기기의 성능차이라고 생각합니다 (하긴 i5 샌디브릿지랑 갤탭 싱글코어를 비교하는 것 자체가 무리)

이렇게 하나둘씩 제 게임에 최적화를 이뤄내고 있습니다 (...) 오늘은 노트에디터를 만들고자 합니다. 이제까지 한 작업중에서 가장 빡샐 것으로 예상됩니다 (?!!!)