2009-07-08 8 views
3

배포 시간에 내 코드가 실행될 시스템의 종류를 알지 못한다면 시스템의 잠재력을 척도로 사용하는 성능 벤치 마크를 작성하려면 어떻게해야합니까?단위 테스트를 통해 상대적 성능을 측정하려면 어떻게합니까?

시스템이 코드 조각을 초당 1000 번 실행할 수 있다면 가능한 한 1000에 가까워 지는지 테스트하고 싶습니다. 500 회 밖에 할 수 없다면 비교할만한 속도입니다.

답변을 좀 더 구체적으로 작성하면 JUnit4를 사용하고 있습니다.

감사합니다.

+0

왜 프로파일 러 대신 단위 테스트를 원하십니까? – Paco

+0

다른 사람들은 단위 테스트가 성능 테스트가 아니라 오히려 "예상 기능 테스트"라는 분명한 포인트를 제시했습니다. 성능 프로파일 링은 단순한 짐승이 아닙니다. – STW

답변

5

테스트

는 패스가/임계 값을 실패 의미합니다. 성능 테스트의 경우 이는 너무 느리고 실패하면 빠르며 빠져 나갑니다. 실패하면 재 작업을 시작합니다.

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

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

이들 중 어떤 것이 든 "기능"측정을 제공합니다. 하나 이상을 선택하십시오. 그들은 모두 좋다. 똑같이 논쟁의 여지가있다. 경쟁자에게 편향되어 있고 멀리 떨어져 있습니다.

일단 벤치 마크를 실행하면 소프트웨어를 실행하고 시스템이 실제로 수행하는 작업을 볼 수 있습니다.

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

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

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

+0

기본적으로 테스트 결과를 비교할 기존 벤치 마크가 필요합니다. –

6

두 가지 이유로 성능 테스트에 단위 테스트를 사용하지 않을 것입니다.

먼저 단위 테스트는 주변 시스템/코드에 종속되지 않아야합니다. 성능 테스트는 하드웨어/OS에 크게 의존하므로 개발자 워크 스테이션, 서버 구축 등에서 사용할 수있는 일관된 조치를 취하는 것은 어렵습니다.

두 번째로 단위 테스트는 매우 빠르게 실행되어야합니다. 성능 테스트를 수행 할 때 대개 상당히 큰 데이터 세트를 갖고 평균 횟수로 주문 횟수를 두 번 반복하여 오버 헤드를 없애는 등의 작업이 필요합니다. 이것들은 모두 빠른 테스트 아이디어에 반하는 것입니다.

+0

좋은 대답은 제 질문이 아니라 좋은 대답입니다. –

+0

다운 투표시 의견을주십시오. –

0

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

필자가 수행 한 것은 델타 cpu 시간을 테스트하여 최근 빌드를 인계 한 것입니다. 참고, CPU 시간은 실시간이 아닙니다. 실제 가치는 그다지 중요하지 않습니다. 중요한 점은 얼마나 중요한가입니다.

테스트의 런타임을 크게 변경 한 알고리즘을 변경하면 해당 변경 집합을 쉽게 확대 할 수 있습니다. 제가 정말로 관심을 갖는 부분은 이러한 관심 사항입니다. 반드시 절대적인 가치는 아닙니다. 실시간 시스템에는 많은 상충 관계가 있으며, 이들을 간단한 비교로 항상 테스트 프레임 워크에 표시 할 수있는 것은 아닙니다.

절대 시간을보고 정상화하면 처음에는 적당하지만 실제 시스템과 대상 시스템 간의 변환은 비선형 적입니다. 예를 들어 캐시 압력, 스왑 사용량, 대상 시스템의 디스크 속도 등이 원인 일 수 있습니다 테스트가 시스템과 다른 임계 값에서 폭발하는 시간.

당신이 절대적으로이 점에서 정확한 검사를해야하는 경우, 대상 시스템을 복제하고 당신이 그것을에있을 예상대로 테스트 노예로하지만, 비슷한 환경에서 그것을 사용할 수 있습니다.

를가 수도 내 경우에는 실제로 펌웨어를 DSP에 다운로드하거나, 원격으로 전원을 껐다가 켜거나, 직렬 포트에서 응답을 읽거나, 충돌로 응답이없는 것을 볼 수 있습니다! --jeffk ++

2

나는 단위 테스트가 성능 테스트를 수행하는 적절한 방법이 아니라고 말하면 Brian에 동의합니다.. 그러나 다른 시스템 구성/환경에서 실행하기 위해통합 테스트로 사용할 수있는 간단한 예제를 작성했습니다.
이 점에 관해서 무엇을 할 수 있는지에 대한 아이디어 만 제공하고 시스템 성능에 대한 공식 성명서를 뒷받침 할 정도로 정확한 결과는 제공하지 않습니다.

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); 
    } 
} 
관련 문제