문제

배포 시간에 어떤 종류의 시스템이 실행될 것인지 모르겠다는 점을 감안할 때 시스템의 잠재력을 척도로 사용하는 성능 벤치 마크를 어떻게 작성합니까?

내 말은 시스템이 초당 1000 번 코드 조각을 실행할 수 있다면 가능한 한 1000에 가까워 지도록 테스트를 원합니다. 그것이 500 만 할 수 있다면, 그것이 내가 비교하고 싶은 속도입니다.

답을보다 구체적으로 만드는 데 도움이된다면 Junit4를 사용하고 있습니다.

고맙습니다.

도움이 되었습니까?

해결책

테스트는 패스/실패 임계 값이 있음을 의미합니다. 성능 테스트의 경우 이것은 너무 느리고 실패하고 충분히 빠르게 통과합니다. 실패하면 재 작업을 시작합니다.

실패 할 수 없다면 실제로 테스트하지 않고 벤치마킹 중입니다.

"시스템은"실행할 수 있습니다 "에 대해 이야기 할 때"유능한 "을 정의해야합니다. 많은 하드웨어 성능 벤치 마크를 사용할 수 있습니다. Whetstone, dhrystone 등은 인기가 있습니다. 또는 데이터베이스 집약적 인 응용 프로그램이있을 수도 있고 TPC 벤치 마크를보고 싶을 수도 있습니다. 또는 네트워크 집약적 인 응용 프로그램이 있고 NetPerf를 사용하고 싶을 수도 있습니다. 또는 GUI 집약적 인 응용 프로그램이며 일종의 그래픽 벤치 마크를 사용하려고합니다.

이들 중 하나는 당신에게 일종의 "기능"측정을 제공합니다. 하나 이상을 선택하십시오. 그들은 모두 좋습니다. 똑같이 논쟁의 여지가 있습니다. 당신의 경쟁 업체를 향해 편견을 느끼고 당신에게서 멀어졌습니다.

벤치 마크를 실행하면 소프트웨어를 실행하고 시스템이 실제로 무엇을하는지 확인할 수 있습니다.

충분한 데이터를 수집하는 경우 일부 벤치 마크 번호와 성능 번호간에 상관 관계를 설정할 수 있습니다. 워크로드, 하드웨어 구성, OS 버전, 가상 머신, DB 서버 등을 기반으로 모든 종류의 변형이 표시됩니다.

충분한 구성이 충분한 충분한 상자의 충분한 데이터를 사용하면 "이 하드웨어, 소프트웨어, 튜닝 매개 변수 및 구성을 제공하면 내 소프트웨어가 초당 [x] 트랜잭션을 수행 할 것으로 기대하는 성능 모델을 개발할 수 있습니다. 그것은 "유능한"에 대한 확실한 정의입니다.

해당 모델이 있으면 소프트웨어를 기능 번호와 비교할 수 있습니다. 매우 완전한 모델을 가질 때까지 어떤 시스템이 코드 조각을 초당 1000 회 실행할 수 있는지 알지 못합니다.

다른 팁

몇 가지 이유로 성능 테스트를 위해 단위 테스트를 사용하지 않습니다.

첫째, 단위 테스트는 주변 시스템/코드에 종속성이 없어야합니다. 성능 테스트는 하드웨어/OS에 크게 의존하므로 개발자 워크 스테이션, 빌드 서버 등 모두에서 사용할 수있는 균일 한 측정을 얻기가 어렵습니다.

둘째, 단위 테스트는 실제로 빠르게 실행해야합니다. 성능 테스트를 수행 할 때는 일반적으로 상당히 큰 데이터 세트를 갖고 평균 수를 순서대로 몇 번 실행하는 수를 반복하고 오버 헤드 등을 제거하려고합니다. 이것들은 모두 빠른 테스트 아이디어에 반대합니다.

나는 동의한다 브라이언 그가 그렇게 말할 때 단위 테스트는 성능 테스트를 수행하는 적절한 방법이 아닙니다.. 그러나 나는 통합 테스트 다른 시스템 구성/환경에서 실행합니다.
이는 이와 관련하여 수행 할 수있는 일에 대한 아이디어를 제공하는 것이며 시스템의 성능에 대한 공식 진술을 백업하기에 충분히 정확한 결과를 제공하지 않습니다.

import static org.junit.Assert.*;
import org.junit.Test;

package com.stackoverflow.samples.tests {

    @Test
    public void doStuffRuns500TimesPerSecond() {
        long maximumRunningTime = 1000;
        long currentRunningTime = 0;
        int iterations = 0;

        do {
            long startTime = System.getTimeMillis();

            // do stuff

            currentRunningTime += System.getTimeMillis() - startTime;
            iterations++;
        }
        while (currentRunningTime <= maximumRunningTime);

        assertEquals(500, iterations);
    }
}

계산하는 데 너무 오래 걸리는 정답이 실패하는 실시간 시스템으로 향하는 코드 테스트에 대한 시간 측정을 수행합니다.

내가하는 일은 테스트가 최근 빌드를 인수 한 델타 CPU 시간을 플로팅하는 것입니다. CPU 시간은 실시간이 아닙니다. 실제 값은 너무 중요하지 않습니다. 중요한 것은 그것이 얼마나 많이 바뀌는 지입니다.

테스트의 실행 시간을 크게 변경하여 알고리즘으로 변경하면 특정 변경 사항을 쉽게 확대 할 수 있습니다. 내가 정말로 신경 쓰는 것은 이러한 관심 지점입니다. 반드시 절대적인 가치는 아닙니다. 실시간 시스템에는 종종 많은 트레이드 오프가 있으며, 이들은 항상 간단한 비교로 테스트 프레임 워크에 표시 될 수는 없습니다.

절대 시간을보고 처음에는 정규화하면 합리적으로 보이지만 실제로 시스템과 대상 시스템 간의 변환은 비선형이됩니다. 예를 들어 캐시 압력, 스왑 사용, 대상 시스템의 디스크 속도 등이 시간을 초래할 수 있습니다. 시스템과 다른 임계 값으로 폭발하여 테스트하십시오.

이와 관련하여 정확한 테스트가 절대적으로 필요하다면 대상 시스템을 복제하고 테스트 슬레이브로 사용하지만 예상대로 비슷한 환경에서 사용하십시오.

필자의 경우 실제로 펌웨어를 DSP로 다운로드하거나 원격으로 파워 사이클링하거나 직렬 포트의 응답을 읽거나 충돌하여 응답이없는 것일 수 있습니다!

-jeffk ++

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top