2014-05-23 2 views
0

내가 좋아하는, 루프 내부의 객체를 선언에 대한 몇 가지 다른 질문을 읽었습니다 :자바 루프 객체 선언은 가장 좋은 방법

Is it Better practice to Declare individual objects or loop Anonymous objects into ArrayList?

Java : declaring objects in a loop

하지만 둘 다 정말 내 문제를 해결합니다.

나는 반복적으로 사용자 입력에 대한 검사 및 해당 문자열을 구문 분석하는 클래스를 만드는거야마다 반복 :

public static void main(String[] args) { 
     while (true) { 
      System.out.print("Enter a string of brackets to test: "); 
      String exp = new Scanner(System.in).nextLine().trim(); 
      if (exp.equals("q")) break; // q is the 'quit' flag 
      System.out.println(new BracketMatcher(exp.length()).parse(exp)); 
     } 
    } 

어떤 차이가 있습니까 - 성능이 아닌 범위에서 -이 블록은?

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    BracketMatcher matcher; 
    while (true) { 
     System.out.print("Enter a string of brackets to test: "); 
     String exp = input.nextLine().trim(); 
     if (exp.equals("q")) break; // q is the 'quit' flag 
     matcher = new BracketMatcher(exp.length()); 
     System.out.println(matcher.parse(exp)); 
    } 

나는 그 방법을 사용하기 때문에 BracketMatcher에서 정적 메서드 인 parse()를 만드는 것이 더 좋을까요?

감사합니다.

+0

그 차이가 있다면, 그것을 JIT 컴파일러가 일단 사라지면 빨리 사라집니다. 나는 확실히 알지 못한다 ... – awksp

+0

오, 그래, 거기에 차이가있을 것이다 - '스캐너'에 대한, 'BracketMatcher'. – awksp

+1

예 성능에는 차이가 있지만 중요하지 않습니다. 사용자 입력을 기다리고 있기 때문에 성능상의 이득을 완전히 극복 할 수 있습니다. 비교할 때 성능 차이는 중요하지 않습니다. –

답변

2

코드의 성능 차이는 모든 반복에서 새 스캐너를 만드는 것입니다. 스캐너가 버퍼링되는 방식에 따라 안정적으로 작동하지 않을 수도 있습니다.

변수를 선언 한 곳에서는 성능에 영향을 미치지 않습니다.

개인적으로 스캐너는 한 번만 작성하는 것이 아니라 모든 행을 읽어야하기 때문에 한 번만 작성해야하지만 루프 내부의 BracketMatcher는 현재 행에 연결되어 있으므로 스캐너를 한 번만 작성합니다.

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    while (true) { 
     System.out.print("Enter a string of brackets to test: "); 
     String exp = input.nextLine().trim(); 
     if (exp.equals("q")) break; // q is the 'quit' flag 
     System.out.println(new BracketMatcher(exp.length()).parse(exp)); 
    } 
} 

은 내가 아니라 방법을 사용하기 때문에 BracketMatcher에서 구문 분석() 정적 방법을 더 잘 수 있을까요?

BracketMatcher의 역할과 입력에 관계없이 준비 할 수있는 항목이 있는지 알 수 없습니다. 예를 들어, 정규 표현식 matchers는 고정 된 표현식에 대해 한 번 컴파일 된 다음 일치시킬 많은 문자열에 대해 다시 사용될 수 있습니다. 이 경우 BracketMatcher를 상태 저장 객체로 유지하고 루프 외부에서 한 번 생성 할 수 있습니다.

0

new Scanner(...) 할당을 수행하는 것은 일반적으로 개체를 다시 사용하는 것보다 성능이 떨어집니다. 특히 개체 자체에 관련된 내부 상태가없는 경우 - 매번 새 개체를 할당하면 아무 것도 수행하지 않습니다.

그래서 네, 하나씩 만들고 다시 사용하겠습니다.

나는 그 방법을 사용하기 때문에 BracketMatcher 에서 정적 메서드 인 parse()를 만드는 것이 더 좋을까요?

BracketMatcher에 상태가 없으면 정적 메서드로 지정할 수 있습니다.스캐너를 여러 번 작성하는 경우

+0

BracketMatcher 생성자에'str.length()'크기의 스택을 생성합니다. 이 메소드를 정적으로 만들면'parse()'가 호출 될 때마다 새로운 스택을 생성하게 될 것입니다. – Undefined

0

당신은 당신이 때문에 스팸 공격 입력 스캐너의 약간 buggier 시스템을 확보 (때문에 가비지 컬렉션과 구축의) 성능을 잃게

내가 상상하는 것
관련 문제