자바 코드 팁의 성능을 개선하는 데 도움이

머리말

프로그램의 성능은 직접 코드의 품질에 영향을받습니다. 연습은 팁에 초점을 맞추고 일부 코드를 작성합니다. 하지만 사소한 프로그래밍 기술을 보이지만 잠재적으로 기하 급수적으로 시스템 성능을 향상, 그래서 관심의 가치가있다.

이상주의

자바 개발에서 종종 시도 - 캐치 오류 트래핑을 사용하지만, 시도 - 캐치 시스템 성능의 측면에서 진술하는 것은 매우 좋지 않습니다. 시도 - 캐치 있지만, 우리는 가져 그녀의 성능의 손실을 인식 할 수는 없지만 시도-catch 문은 순환에 사용하거나 몸을 통과되면, 시스템 성능에 큰 해를 입힐 것입니다.

다음은 시도 - 캐치 루프 본문에 적용을 코드의 예입니다 :

    @Test
     공개  공극 test11 () { 

        길이 = 시작 ()에 System.currentTimeMillis 단계;
        INT의 A = 0 ;
        위한 ( int로 ; 난을 1000000000 <I ++는 I = 0 ) {
             시도 {
                 ++ ; 
            } 캐치 (예외 전자) { 
                e.printStackTrace (); 
            } 
        } 
         useTime =에 System.currentTimeMillis () - 시작; 
        에서 System.out.println ( "useTime :"+ useTime); 

    }

이것의 결과는 위의 코드를 실행하는 것입니다 :

useTime : 10

다음은 코드 체외주기를 이동하는 시도 - 캐치하고, 다음 성능은 거의 절반을 향상시킨다. 다음과 같습니다 :

    @Test
     공개  공극 시험 () {
         길이 = 시작 ()에 System.currentTimeMillis 단계;
        INT의 A = 0 ;
        시도 {
             위해 ( int로 , 내가 1000000000 <; I = 0 난 ++ ) { ++를 ; 
            } 
        } 캐치 (예외 전자) { 
            e.printStackTrace (); 
        } 
         useTime =에 System.currentTimeMillis () - 시작; 
        에서 System.out.println (useTime); 
    }

결과 :

useTime : 6

지역 변수를 사용하여

배달 메서드 호출 매개 변수와 통화에서 만든 임시 변수는 빠르고 스택 (스택)에 저장됩니다. 등 정적 변수, 인스턴스 변수와 같은 다른 변수는 느리게 만들 힙 (힙)에있다.

다음은 지역 변수 코드 계산입니다 :

   @Test
     공개  공극 test11 () { 

        길이 = 시작 ()에 System.currentTimeMillis 단계;
        INT의 A = 0 ;
        위한 ( int로 I = 0; i가 1,000,000,000을 <; 내가 ++ ) { ++를 ; 
        } 
         useTime =에 System.currentTimeMillis () - 시작; 
        에서 System.out.println ( "useTime :"+ useTime); 

    }

결과 :

useTime : 5

정적 클래스 변수는 지역 변수를 대체 :

    정적  INT의 AA = 0 ; 
    @Test 
    공개  공극 시험 () {
         길이 = 시작 ()에 System.currentTimeMillis 단계; 

        위한 ( int로 , 내가 1000000000 <; I = 0 난 ++ ) { 
            단을 ++ ; 
        } 
         useTime =에 System.currentTimeMillis () - 시작; 
        에서 System.out.println ( "useTime :"+ useTime); 
    }

결과 :

useTime 94

두 번 이상의 결과를 실행하여 로컬 변수에 대한 액세스 속도가 클래스 멤버 변수보다 훨씬 높은 것입니다 볼 수 있습니다.

비트 곱셈과 나눗셈 연산 대신

모든 작업에서 비트 연산이 가장 효율적입니다. 따라서, 시스템의 동작 속도를 증가시키기 위해, 비트 연산의 일부를 바꾸려고. 가장 일반적인 정수 곱셈과 나눗셈을 위해 최적화된다.

다음은 산술 연산 코드의 사용이다 :

    @Test
     공개  공극 test11 () { 

        길이 = 시작 ()에 System.currentTimeMillis 단계;
        INT의 A = 0 ;
        위한 ( int로 , 내가 1000000000 <; I = 0 난 ++ ) { * = 2 ; / = 2 ; 
        } 
         useTime =에 System.currentTimeMillis () - 시작; 
        에서 System.out.println ( "useTime :"+ useTime); 
    }

결과 :

useTime : 1451

다음과 같이 등가 비트 연산 코드는 루프 본체에서 곱셈과 나눗셈은 :

    @Test
     공개  공극 시험 () {
         길이 = 시작 ()에 System.currentTimeMillis 단계;
        INT의 AA = 0 ;
        위한 ( int로 , 내가 1000000000 <; I = 0 난 ++ ) { 
            단을 << = 1 ; 
            AA는 >> = 1 ; 
        } 
         useTime =에 System.currentTimeMillis () - 시작; 
        에서 System.out.println ( "useTime :"+ useTime); 
    }

결과 :

useTime : 10

두 개의 코드에있는 동일한 기능을 수행 각 사이클에서, 정수 2 승산되고, 2로 나누어. 그러나 시간이 많이 소요 차이의 결과는 매우 큰, 그래서 비트 컴퓨팅 효율은 여전히 ​​분명하다.

추출 표현

소프트웨어 개발 과정에서 프로그래머가 쉽게 고의 또는 실수로 코드를 만들 수 있습니다, 일부 "중복", 대부분의 경우에, 때문에 컴퓨터의 고속 동작의 "노력의 중복은"성능에 위협의 대부분을 구성하지 않습니다을, 당신이 한계에 시스템 성능을 재생하려면 그러나 "노력의 중복"매우 의미있는 추출합니다.

다음 코드 예는 두 연산이 수행된다 :

    @Test
     공개  공극 testExpression () {
         길이 = 시작 ()에 System.currentTimeMillis 단계;
        더블 D = 인 Math.random ();
        이중 A = 인 Math.random ();
        이중 B = 인 Math.random ();
        이중 E = 인 Math.random (); 

        이중 X, Y;
        위한 ( int로 , 나는 10000000 <; I = 0 난 ++ ) { 
            X = 위해 D * A * B / 3 * 4 * a 및 
            Y = E * A * B / 3 * 4 * a 및 
        } 
         useTime =에 System.currentTimeMillis () - 시작;
        에서 System.out.println ( "useTime :"+ useTime); 

    }

결과 :

useTime : 21

자세히 살펴보면 두 정확히 후반 같은 계산식은, 또한 각주기에있어서, 동일한 표현의 일부를 재 계산하는 것을 의미 찾을 수있다.

그래서 그것을 개선하기 위해, 다음과 같이된다 :

    @Test
     공개  공극 testExpression99 () {
          시작 = System.currentTimeMillis는 ();
        더블 D = 인 Math.random ();
        이중 A = 인 Math.random ();
        이중 B = 인 Math.random ();
        이중 E = 인 Math.random (); 

        이중 P, X, Y;
        위한 ( int로 , 나는 10000000 <; I = 0 난 ++ ) { 
            P = A * B / 3 * 4 * a 및 
            X = D *의 P; 
            Y = E *에서의 P; 
        } 
        useTime에 System.currentTimeMillis = () - 시작; 
        에서 System.out.println ( "useTime :"+ useTime); 
    }

결과 :

useTime : 11

우리는 결과에 특정 최적화의 효과를 볼 수 있습니다.

일정주기의 시간이 소요되는 작업을 수행 할 필요가 있고, 루프의 본체는, 실행 결과는 항상 고유 한 경우 마찬가지로, 체외 순환을 추출한다.

예를 들어 다음 코드의 경우 :

위한 ( int로 I = 0; I <100000; 내가 ++ ) { 
    X [I] = Math.PI로 Math.sin 이런 * (Y) * I; 
}

다음 코드를 수정해야합니다 :

// 추출 복잡한 비즈니스 로직 처리 결과는 체외 순환에 고정 
이중 P * = Math.PI로 ]으로, Math.sin (Y)
 에 대해 ( int로 된 I = 0; I <100000; I는 ++ ) { 
    X [I]는 = P * I ; 
}

) (arrayCopy를 사용하여

배열 복제 사용 기능의 높은 주파수, JDK는 그것을 구현하기위한 효율적인 API를 제공합니다.

/ ** 
     * @param       소스 배열 SRC. 
     * @param의       소스 어레이의 시작 위치로부터 srcPos. 
     * @param는       대상 배열 전송처. 
     * @param의       대상 데이터의 개시 위치로부터 destPos. 
     * @param의       배열 요소의 길이의 수는 복사한다. 
     * 예외 :의   복사는 경우 IndexOutOfBoundsException를 야기하는 경우 
     * 데이터를 외부 배열 범위의 액세스 할 수 있습니다. 
     * 예외 :    하여 ArrayStoreException 경우 <코드>의 요소 SRC </ 코드>
     * 배열은 <코드> 최종 도착 </ 코드> 어레이에 저장 될 수없는 
     있기 때문에, 형태 불일치 *. 
     * 예외 :의   NullPointerException이 경우 어느 하나의 <code> SRC </ 코드> 또는 
     * <코드> 최종 도착 </ 코드>는 <코드>는 null </ 코드>. 
     * / 
    공공  정적  기본  무효 arraycopy (개체 SRC,   int로   로부터 srcPos, 
                                        개체의 이명 령을 int로 , destPos가를
                                         INT의 길이);

응용 프로그램에서 배열을 복사해야하는 경우, 당신은 오히려 달성하는 것보다,이 기능을 사용합니다.

아래의 예시 :

    @Test
     공개  공극 testArrayCopy () {
         INT의 크기 = 100000 ;
        INT [] 배열 = 새로운  INT [크기];
        INT [] = arraydest 새로운  INT [크기]; 

        위한 ( int로 I = 0; I는 <사항 Array.length; 내가 ++ ) { 
            배열 [I] = I; 
        } 
         = 시작 ()에 System.currentTimeMillis;
         ( INT에서 K = 0; K <1000; 케이 ++ ) {
             // 进行复制 
            System.arraycopy에 (배열 0 arraydest 0  , 크기);
        }
         useTime =에 System.currentTimeMillis () - 시작; 
        에서 System.out.println ( "useTime :"+ useTime); 
    }

결과 :

useTime 59

프로그램이 자신의 복사본의 배열을 달성하는 경우에는 다음과 같이 대응하여, 해당 코드 :

    @Test
     공개  공극 testArrayCopy99 () {
         INT의 크기 = 100000 ;
        INT [] 배열 = 새로운  INT [크기];
        INT [] = arraydest 새로운  INT [크기]; 

        위한 ( int로 I = 0; I는 <사항 Array.length; 내가 ++ ) { 
            배열 [I] = I; 
        } 
         = 시작 ()에 System.currentTimeMillis;
         ( INT에서 K = 0; K <1,000; ++ 케이 ) {
             위해 ( int로 된 I = 0; I는 크기 <; 내가 ++ ) { 
                [I] arraydest= 배열 [I]; 
            } 
        } 
         useTime =에 System.currentTimeMillis () - 시작; 
        에서 System.out.println ( "useTime :"+ useTime); 
    }

결과 :

useTime : 102

효과 결과로 볼 수있다.

System.arraycopy에 () 함수는 원시 함수이므로, 성능이 정상적인 기능 기본 기능 일반적으로 우수하다. 프로그램 개발시에만 성능상의 이유로 들어, 당신은 가능한 한 네이티브 함수를 호출해야합니다.

 

 

 

돌아 가기 지속적으로 업데이트됩니다. . .

추천

출처www.cnblogs.com/jimoer/p/10787672.html