2016-08-08 11 views
1

문자열 컴파일 시간 상수 (내부화 문자열)와 리터럴은 ==와 비교할 수 있습니다. 이는 컴파일 타임에 같은 참조가 할당되었으므로 어떻게 든 동일하면 같습니다.코드의 문자열 상수/리터럴은 컴파일 속도가 상당히 느려 집니까?

즉, n 개의 문자열 리터럴로 구성된 코드를 컴파일하는 데 n log (n) 시간이 필요합니까?

누군가가 이미 답을 알고있을 수도 있고 확실하고 재현 가능하거나 중요한 방식으로 효과를 측정하는 테스트를 작성할 수 있기 때문에이 질문을 던집니다. 또는이 테스트는 현실 세계의 제약 등을 반영 할 것입니다.

제가 테스트 케이스를 발표 할 예정입니다. 제안 할 시간이 있으시면 언제든지 구현해 드리겠습니다. .

+1

나는 약 100kB의 텍스트를 문자열에 넣으려고 시도한 마지막 시간에 너무 잘 끝나지 않았다는 것을 기억합니다. 나는 컴파일 시간 또한 문자열 길이에 의존하지만 그 경향에 대해 확신하지 못한다고 생각한다. –

+1

왜 컴파일 시간이 달라지겠습니까? 비교는 여전히 런타임에 수행됩니다. –

+0

그것은 단지 좋은 추측이지만, "this"와 같은 문자열 리터럴은 공간을 차지하고 디스크 읽기 및 쓰기 시간을 소비하지만 'final String s = "Something";과 같은 문자열 상수는 일부를 소비합니다 너무 많은 유스 케이스가 있으면 컴파일 시간에 영향을 미칠 것이다. –

답변

1

코드의 문자열 상수/리터럴은 컴파일 속도가 상당히 느려 집니까?

문자열 시상수 (내재화 - 스트링)을 컴파일하고 든 동일한 경우가 컴파일 시간에 동일한 부호를 부여되므로 리터럴은 ==와 비교 될 수있다.

아니요. 그들은 을 .class 파일의 상수 영역에 컴파일시에 저장하며, 참조가 할당 될 때 클래스 로딩 시간에 입니다.

이렇게하면 n 개의 문자열 리터럴로 구성된 코드를 컴파일하는 데 n log (n) 시간이 걸리는 것입니까?

아니요 본질적으로 O (N log (N)) 과정이 없습니다. 풀링은 합리적인 구현의 해시 테이블과 내부 테스트를 통해 O (1)입니다.

[그것은 물론 컴파일러 또는 O (N 로그 (N)) 또는 O (N^3) 또는 나빴다 intern() 방법을 구성 가능 될 것이나, 그렇지 않다 귀하의 질문에 뭐든지 수반됩니다.]

+0

@HopefullyHelpful 컴파일시 모든 문자열 *이 해시 테이블에 저장됩니다. 아니면 런타임에 대해 묻고 있습니까? – EJP

+1

그래서 당신은 * 런타임에 대해 묻고 있습니까? 질문에 대한 답변은 도움이됩니다. 시간 비용으로 공간 비용을 고려해야합니다. 런타임 문자열 풀은 Java 1.3에서부터 가비지 수집되지 않았으므로, 그때까지는 엄청난 공간 낭비가 있었을 것입니다. 따라서'intern()'디자인입니다. 가장 많이 실행되는 Java 프로그램의 객체 절반은 문자 배열과 그 객체를 포함하는 문자열입니다. – EJP

+0

예. 현명한 대답으로 이미 대답했습니다. – EJP