시스템인 이유Java 네이티브 어레이 복사
자바 소스에서 그 시스템을 보고 놀랐습니다.arraycopy는 네이티브 메서드입니다.
물론 그 이유는 그것이 더 빠르기 때문이다.하지만 코드를 통해 더 빠르게 만들 수 있는 기본 기술은 무엇일까요?
원래 어레이를 루프하여 각각의 포인터를 새로운 어레이에 복사하는 것은 어떨까요?이 작업은 그다지 느리고 번거롭지 않습니다.
네이티브 코드에서는, 1개의 코드로 실행할 수 있습니다.memcpy
/ (n개의 개별 복사 작업이 아닌 경우).성능의 차이는 상당합니다.
자바에서는 쓸 수 없어요.네이티브 코드는 오브젝트 배열과 프리미티브 배열의 차이를 무시하거나 회피할 수 있습니다.자바는 적어도 효율적이지는 않지만, 그렇게 할 수 없습니다.
그리고 한 장으로는 쓸 수 없다.memcpy()
중복되는 배열에 필요한 의미론 때문입니다.
물론 구현에 의존합니다.
HotSpot은 이를 '인트린식'으로 취급하여 콜 사이트에 코드를 삽입합니다.그것은 기계 코드이지 느린 구형 C 코드가 아닙니다.이는 또한 메서드의 시그니처에 대한 문제가 크게 해소되었음을 의미합니다.
단순한 복사 루프는 명확한 최적화를 적용할 수 있을 정도로 단순합니다.예를 들어 루프 언롤링입니다.정확히 무슨 일이 일어나는지는 다시 구현에 달려 있습니다.
내 시험 시스템에서.arraycopy()(복사용)는 루프용 인터리빙보다 10~20배 빠릅니다.
float[][] foo = mLoadMillionsOfPoints(); // result is a float[1200000][9]
float[][] fooCpy = new float[foo.length][foo[0].length];
long lTime = System.currentTimeMillis();
System.arraycopy(foo, 0, fooCpy, 0, foo.length);
System.out.println("native duration: " + (System.currentTimeMillis() - lTime) + " ms");
lTime = System.currentTimeMillis();
for (int i = 0; i < foo.length; i++)
{
for (int j = 0; j < foo[0].length; j++)
{
fooCpy[i][j] = foo[i][j];
}
}
System.out.println("System.arraycopy() duration: " + (System.currentTimeMillis() - lTime) + " ms");
for (int i = 0; i < foo.length; i++)
{
for (int j = 0; j < foo[0].length; j++)
{
if (fooCpy[i][j] != foo[i][j])
{
System.err.println("ERROR at " + i + ", " + j);
}
}
}
다음의 출력이 있습니다.
System.arraycopy() duration: 1 ms
loop duration: 16 ms
몇 가지 이유가 있습니다.
JIT는 수동으로 작성된 C 코드만큼 효율적인 로우 레벨 코드를 생성할 수 없습니다.Low level C를 사용하면 일반 JIT 컴파일러에서는 불가능에 가까운 많은 최적화가 가능합니다.
수기 C 실장의 요령과 속도 비교에 대해서는, 다음의 링크를 참조해 주세요(memcpy, 단 원칙은 동일합니다).이 Memcpy 최적화를 선택하면 속도가 향상됩니다.
C 버전은 어레이 멤버의 유형과 크기에 거의 의존하지 않습니다.어레이 콘텐츠를 메모리의 원시 블록(예: 포인터)으로 가져올 방법이 없기 때문에 Java에서는 동일한 작업을 수행할 수 없습니다.
언급URL : https://stackoverflow.com/questions/2772152/why-is-system-arraycopy-native-in-java
'IT' 카테고리의 다른 글
Vue.js에서 새로운 무효 속성 설정 (0) | 2022.10.19 |
---|---|
저장된 이미지 주위의 공백 제거 (0) | 2022.10.19 |
Python 문자열에서 \xa0을 삭제하는 방법 (0) | 2022.10.19 |
두 열의 조합을 위한 양방향 고유 키 제약 조건 (0) | 2022.10.19 |
높이가 100%인 풀스크린 iframe (0) | 2022.10.19 |