Programming/Java
-
[Java] Heap Memory 체크 (JSTAT)2021.03.29
-
[Java] Collection sort2016.01.07
[Java Stream] anyMatch() vs filter().count > 0 성능 비교
Stream anyMatch() vs filter.count > 0 성능 비교
개요
Java에서 스트림으로 작업할 때 조건자 or 기준과 일치하는 항목이 하나 이상 있는지 확인하는 로직을 작성할 때가 있습니다.
anyMatch()와 filter().count > 0 Stream API는 동일한 처리를 하지만 anyMatch()를 사용하는 것이 더 안전하고 성능상에 장점이 있는데 그 차이점에 대해 알아보고자 합니다.
차이점
가장 큰 차이점은 anyMatch()의 경우 Stream 요소에 일치하는 첫번째 항목이 존재하면, Stream을 중지하고 결과를 반환하게 됩니다.
반면에 count()의 경우는 모든 Stream 요소를 순회하고 그 결과인 count를 반환하게 됩니다.
Stream 요소가 작을 경우는 큰 차이가 없겠지만, Stream의 요소가 크면 클수록 성능상에 영향을 미칠 수 있습니다.
Code
일치하는 요소가 존재하면 Stream 종료
return component.getContents()
.stream()
.anyMatch(x -> "v1000".contains(x.getContentsCode())) ? "Y" : "N";
Contents Size까지 스트림 순회하고 count 반환
return component.getContents()
.stream()
.filter(x -> "v1000".contains(x.getContentsCode()))
.count() > 0 ? "Y" : "N";
'Programming > Java' 카테고리의 다른 글
[Java] Heap Memory 체크 (JSTAT) (0) | 2021.03.29 |
---|---|
[Java] Collection sort (0) | 2016.01.07 |
[Java] GMT/UTC 날짜 변환 (1) | 2015.04.08 |
[오류]Setting property 'source' to 'org.eclipse.jst.jee.server:프로젝트명' did not find a matching property (0) | 2014.04.08 |
올바른 eqals() 사용법 (0) | 2014.02.07 |
[Java] Heap Memory 체크 (JSTAT)
JSTAT GC 메모리 관리
자바에서 메모리 관리의 효율성을 위해 제공하는 Tool
Young 영역
Eden 영역에는 신규 객체들이 보관되고, 100% 차게되면 사용하지 않는 객체는 제거되고, 사용되는 객체는 Survivor 0으로 승격(miner gc 수행), S0에서 사용하지 않는 객체 제거 및 사용되는 객체 Survivor 1영역으로 승격(miner gc 수행) 됨. 이 작업이 반복되면서 살아 남은 객체는 Old 영역으로 승격됨. (miner gc 수행 중에는 JVM STW 발생하지 않음)
Old 영역
Eden 영역에서 승격된 객체들이 보관되다가 Old 영역이 100% 되면 major gc 가 발생한다. JVM STW 가 되면서 Old 영역의 메모리를 정리하게 되는데, 이때 major gc 처리 시간을 줄이는 것이 중요함( 1초 미만을 권장하고, 시간에 따라 gc 튜닝이 필요할 수도 있음)
jstat gc memory check
- jstat 옵션
- gc: gc 힙의 통계 정보를 출력
- gccapacity: 힙의 용량 정보를 출력
- gcutil: gc 통계 정보를 출력
- gcnew: new 영역의 정보 출력
- gccause: gc 통계 정보와 gc 발생 원인 출력
- jstat 예시
- jstat [옵션] [PID] [반복 출력 시간]
- S0: S0 영역 사용율
- S1: S1 영역 사용율
- E: Eden 영역 사용율
- O: Old 영역 사용율
- CCS: compressed class space 영역 사용율
- YGC: young 영역 gc count
- FGC: full gc count(major gc)
- FGCT: full gc count time (소요 시간)
- GCT: gc 전체 소요시간 (ygct + fgct)
'Programming > Java' 카테고리의 다른 글
[Java Stream] anyMatch() vs filter().count > 0 성능 비교 (0) | 2023.06.12 |
---|---|
[Java] Collection sort (0) | 2016.01.07 |
[Java] GMT/UTC 날짜 변환 (1) | 2015.04.08 |
[오류]Setting property 'source' to 'org.eclipse.jst.jee.server:프로젝트명' did not find a matching property (0) | 2014.04.08 |
올바른 eqals() 사용법 (0) | 2014.02.07 |
[Java] Collection sort
- JAVA Sort, ArraySort
import java.util.ArrayList;
import java.util.Collections;
public class MainClass{
public static void main(String[] args) {
String[] stringArray = new String[]{"c","e","a","k"};
List<string> list = Arrays.asList(stringArray );
//ArrayList<string> list = new ArrayList<string>();
for(String s: stringArray){
list.add(s);
}
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
for (String s: list) {
System.out.println(s);
}
}
}
public class ArraySort {
public static void main(String[] args) {
String[] s = { "b", "A", "D", "C", "a", "F" };
// 대소문자 구분 정렬
Arrays.sort(s);
System.out.println("==> 대소문자 구분");
System.out.println(Arrays.toString(s)); //[A, C, D, F, a, b]
// 역순정렬
descArraySort(s);
System.out.println("==> 역순정렬 ");
System.out.println(Arrays.toString(s)); //[b, a, F, D, C, A]
// 대소문자 구분 없이 정렬
System.out.println("==> 대소문자 구분 없이 ");
Arrays.sort(s, String.CASE_INSENSITIVE_ORDER);
System.out.println(Arrays.toString(s)); //[a, A, b, C, D, F]
}
public static void descArraySort(String[] arr) {
String temp;
for (int i = 0; i < arr.length / 2; i++) {
temp = arr[i];
arr[i] = arr[(arr.length - 1) - i];
arr[(arr.length - 1) - i] = temp;
}
}
}
'Programming > Java' 카테고리의 다른 글
[Java Stream] anyMatch() vs filter().count > 0 성능 비교 (0) | 2023.06.12 |
---|---|
[Java] Heap Memory 체크 (JSTAT) (0) | 2021.03.29 |
[Java] GMT/UTC 날짜 변환 (1) | 2015.04.08 |
[오류]Setting property 'source' to 'org.eclipse.jst.jee.server:프로젝트명' did not find a matching property (0) | 2014.04.08 |
올바른 eqals() 사용법 (0) | 2014.02.07 |
[Java] GMT/UTC 날짜 변환
GMT/UTC 표준 시간 변환
글로벌 프로젝트 중 PG사로부터 결제완료 일자를 아래와 같은 생소한 format 으로 리턴 받은적이 있는데 컨버트 과정을 거쳐 해결함.
- Response date : 31/3/2015 4:44:30 PM
- Malay : GMT +8
- Korea : GMT +9
/* 작성일 : 2013.11.27
* 내 용 : GMT/UTC 일시 변환
*/
public void getConvert(ParameterMap parameterMap) throws Exception {
//31/3/2015 4:01:59 PM ---> yyyy-MM-dd HH:mm:ss 변환
logger.debug("TIMES " + convertToDate("31/3/2015 4:44:30 PM"));
logger.debug("TIMES " + utcToLocaltime(convertToDate("31/3/2015 4:44:30 PM")));
}
/* convertToDate
* @param datetime
* SimpleDateFormat("yyyy-MM-dd HH:mm:ss") HH 대문자 : 24 Hour
* 소문자 : 12 Hour
*/
public static String convertToDate(String inputDate) throws Exception{
String dateTime = inputDate;
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss a", Locale.US);
Date parseDate = null;
String convertedDate = null;
try {
parseDate = format.parse(dateTime);
DateFormat dateFormatNeeded = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
convertedDate = dateFormatNeeded.format(parseDate);
} catch (ParseException e) {
logger.error("error " + e);
throw new Exception(e);
}
return convertedDate;
}
/* UTC time to local time
*/
public static String utcToLocaltime(String datetime) throws Exception {
String locTime = null;
//TimeZone tz = TimeZone.getTimeZone("GMT+08:00"); 해당 국가 일시 확인 할 때, 한쿸은 +9
TimeZone tz = TimeZone.getDefault();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date parseDate = sdf.parse(datetime);
long milliseconds = parseDate.getTime();
int offset = tz.getOffset(milliseconds);
locTime = sdf.format(milliseconds + offset);
locTime = locTime.replace("+0000", "");
} catch(Exception e) {
e.printStackTrace();
throw new Exception(e);
}
return locTime;
}
/**
* local time to UTC time
*/
public static String localtimeToUTC(String inputdatetime) throws Exception {
String utcTime = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone tz = TimeZone.getDefault();
try {
Date parseDate = sdf.parse(inputdatetime);
long milliseconds = parseDate.getTime();
int offset = tz.getOffset(milliseconds);
utcTime = sdf.format(milliseconds - offset);
utcTime = utcTime.replace("+0000", "");
} catch (Exception e) {
e.printStackTrace();
throw new Exception(e);
}
return utcTime;
}
'Programming > Java' 카테고리의 다른 글
[Java] Heap Memory 체크 (JSTAT) (0) | 2021.03.29 |
---|---|
[Java] Collection sort (0) | 2016.01.07 |
[오류]Setting property 'source' to 'org.eclipse.jst.jee.server:프로젝트명' did not find a matching property (0) | 2014.04.08 |
올바른 eqals() 사용법 (0) | 2014.02.07 |
[Java] split 문자열 나누기 (0) | 2014.02.05 |
[오류]Setting property 'source' to 'org.eclipse.jst.jee.server:프로젝트명' did not find a matching property
정상적으로 실행되던 톰켓에서 아래와 같은 오류를 뱉어 낼 경우가 간혼 있다.
Setting property 'source' to 'org.eclipse.jst.jee.server:프로젝트명' did not find a matching property.
그럴 경우 톰캣 설정에 Server Option 탭에 아래와 같은 설정 후 재기동.
'Programming > Java' 카테고리의 다른 글
[Java] Collection sort (0) | 2016.01.07 |
---|---|
[Java] GMT/UTC 날짜 변환 (1) | 2015.04.08 |
올바른 eqals() 사용법 (0) | 2014.02.07 |
[Java] split 문자열 나누기 (0) | 2014.02.05 |
java e.printStackTrace 로그 남기기 (0) | 2014.01.17 |