System.gc 함수를 쓰지 말라는 이야기는 많이 듣곤 합니다. 왜 그럴까요? 예제 프로그램을 보겠습니다. class A가 있고, 이 클래스 내부에는 finalize가 오버라이딩 되어 있습니다. 이 메서드 안에 들어오면 shared.count가 하나 증가합니다. 정리를 하면, 객체 A가 정리가 되면, shared 클래스 내부에 있는 클래스 변수인 count가 하나 증가합니다. 그리고 class A 안에는 int형 배열 10개가 있습니다. 이제 Main 클래스의 main 메소드를 보겠습니다. 크게 어려운 것은 없어 보입니다. 10개의 객체 A 참조값을 저장할 수 있는 배열을 선언합니다. 그리고, 2만번의 loop를 돌 때 마다, 배열 A에 새로운 A의 참조값 10개를 넣습니다. 이를 그림으로 표현하면 위..
레퍼런스/분석 검색 결과
String 클래스의 replaceAll 메서드는 상당히 많이 쓰는 메서드 중 하나입니다. 이것의 성능 문제에 대해서는, 이미 다른 곳에서도 많이 언급이 되기도 했습니다. 만.. 한 번 더 짚고 넘어가셔도 좋을 듯 싶습니다. 사실 제대로 분석하시려면 컴파일러나 프로그래밍 언어론을 보시는 게 도움이 많이 될 겁니다. replaceAll 메소드는 크게 어려운 게 없습니다. 단지, regex 패턴을 찾으면, 그것을 replacement로 대체합니다. 예를 들자면, 숫자를 없애기 위해서는 regex에 "[0-9]"를, replacement에 ""을 넣으면 됩니다. 내부를 보겠습니다. 보면, Parrern.compile(regex).matcher(this).replaceAll(replacement); 이 문장이 ..
java의 Array.sort는 어떤 정렬 알고리즘을 쓸까요? primitive type을 정렬하는 경우와, 그렇지 않은 경우에 쓰는 알고리즘이 다릅니다. 어떻게 다른지 간단하게 보도록 하겠습니다. java8 기준으로 작성되었음을 참고하시면 됩니다. 먼저 primitive type을 정렬할 때 어떻게 동작할까요? Array.class 안으로 들어가 보겠습니다. int형을 저장해 놓은 배열을 정렬하려는 경우보시면, rangeCheck를 하고, DualPivotQuickSort로 들어간다는 것을 알 수 있습니다. short형은 어떨까요? 마찬가지입니다. DualPivotQuickSort 안으로 들어가 보겠습니다. 먼저, int형 배열을 정렬하는 경우입니다. QuickSort_ThreasHold보다 작으면 s..
어레이리스트의 addAll 메서드의 성능에 대한 글이 간혹 보입니다. 메서드 내부를 뜯어 보면서, 어디서 오버헤드가 걸리는지 알아보도록 하겠습니다. 먼저 Main 클래스의 main 함수 내에 있는 코드는 아래와 같습니다. 생각보다 복잡하지 않습니다. 그냥 단순히 90개의 Integer를 x에 넣어놓고 List x에 있는 것들을 모두 y에 add하는 작업을 하는 코드입니다. addAll 안으로 들어가 보겠습니다. 가장 먼저 보이는 것은 c를 toArray로 바꾸는 것입니다. 즉, ArrayList c를 Array로 바꾸는 작업을 먼저 하는데요. 여기서 무슨 일을 하는지 안으로 들어가 보겠습니다. 일단 581번째 줄의 c는 무엇을 의미할까요? 90개의 Integer가 들어있는 ArrayList를 의미합니다...
Map 계열 메서드 중에서 get, containsKey가 있습니다. 이들은 어떤 메소드들일까요? 먼저, 다음과 같은 정보는 어디에선가 들어보셨으리라 생각이 듭니다. map 계열 구조에 Key값에 대응되는 값 Value를 불러오고 싶을 때 보통 이렇게 많이 쓴다. 그런데, 프로그램 1과 같이 작성하면, 불필요한 연산을 2번 하게 된다. 프로그램 2와 같이 쓰는 것이 좋다. 왜냐하면 불필요한 연산을 수행하지 않기 때문이다. 네. 이 부분은 맞습니다. containsKey나 get나 내부적으로 getNodes라는 것을 호출하는데요. 이것을 1번 수행하냐, 2번 수행하냐의 차이는 생각보다 크게 다가올 수 있습니다. 여기서 질문 하나 드리겠습니다. 프로그램 1의 hm에 들어있는 key 값들의 집합을 k1이라고 ..
최근댓글