벤치마크 스위트

벤치마크 스위트

DuckDB는 광범위한 벤치마크 스위트를 가지고 있어요. 성능 영향이 있을 수 있는 변경을 할 때는 잠재적 성능 회귀를 감지하기 위해 이 벤치마크를 실행하는 것이 중요해요.

출처: 문서

본문

DuckDB는 광범위한 벤치마크 스위트를 가지고 있어요. 성능 영향이 있을 수 있는 변경을 할 때는 잠재적 성능 회귀를 감지하기 위해 이 벤치마크를 실행하는 것이 중요해요.

시작하기

벤치마크 스위트를 빌드하려면 DuckDB 저장소에서 다음 명령을 실행해요.

BUILD_BENCHMARK=1 BUILD_EXTENSIONS='tpch' make

벤치마크 나열하기

사용 가능한 모든 벤치마크를 나열하려면 다음을 실행해요.

build/release/benchmark/benchmark_runner --list

벤치마크 실행하기

단일 벤치마크 실행

단일 벤치마크를 실행하려면 다음 명령을 사용해요.

build/release/benchmark/benchmark_runner benchmark/micro/nulls/no_nulls_addition.benchmark

출력은 CSV 형식으로 stdout에 인쇄돼요. 형식은 다음과 같아요.

name	run	timing
benchmark/micro/nulls/no_nulls_addition.benchmark	1	0.121234
benchmark/micro/nulls/no_nulls_addition.benchmark	2	0.121702
benchmark/micro/nulls/no_nulls_addition.benchmark	3	0.122948
benchmark/micro/nulls/no_nulls_addition.benchmark	4	0.122534
benchmark/micro/nulls/no_nulls_addition.benchmark	5	0.124102

--out 플래그로 출력 파일을 지정할 수도 있어요. 그러면 타이밍만(줄바꿈으로 구분) 해당 파일에 기록돼요.

build/release/benchmark/benchmark_runner benchmark/micro/nulls/no_nulls_addition.benchmark --out=timings.out

출력은 다음을 포함해요.

0.182472
0.185027
0.184163
0.185281
0.182948

정규 표현식으로 여러 벤치마크 실행

실행할 벤치마크를 지정하는 정규 표현식도 사용할 수 있어요. 일부 정규식 문자는 셸에 의해 확장되므로 주의해요 (예: *는 셸에 의해 확장될 가능성이 높아 적절한 따옴표나 이스케이프가 필요해요).

build/release/benchmark/benchmark_runner "benchmark/micro/nulls/.*"
모든 벤치마크 실행

인자를 지정하지 않으면 모든 벤치마크가 실행돼요.

build/release/benchmark/benchmark_runner
기타 옵션

--info 플래그는 벤치마크에 대한 몇 가지 다른 정보를 제공해요.

build/release/benchmark/benchmark_runner benchmark/micro/nulls/no_nulls_addition.benchmark --info
display_name:NULL Addition (no nulls)
group:micro
subgroup:nulls

--query 플래그는 벤치마크가 실행하는 쿼리를 인쇄해요.

SELECT min(i + 1) FROM integers;

--profile 플래그는 쿼리 트리를 출력해요.

벤치마크 만들기

일부 개발 작업은 성능과 관련이 있어요. 다른 테스트와 함께 벤치마크를 포함하면 개선 사항을 검증할 뿐만 아니라 기능의 향후 성능 회귀를 방지해요.

벤치마크 예제

벤치마크 파일을 만드는 방법을 설명하기 위해 FILL 윈도우 함수의 벤치마크를 살펴볼 수 있어요. (FILL 함수는 정렬된 파티션에서 누락된 값을 선형 보간해요.)

벤치마크는 단위 테스트 파일과 유사하며 같은 유형의 헤더를 가져요.

# name: benchmark/micro/window/window_fill.benchmark
# description: Measure the performance of FILL
# group: [window]

make format-head 명령은 헤더가 예상 구조를 가지도록 하고 tidy check 오류를 방지할 수 있어요.

이 헤더 아래에는 벤치마크를 요약하는 일련의 키워드가 있어요.

name FillPerformance
group micro
subgroup window

일부 벤치마크는 단일 쿼리를 실행하지만, argument 키워드로 벤치마크를 _파라미터화_하는 것이 종종 유용해요. 이렇게 하면 데이터 볼륨 같은 다양한 설정으로 벤치마크를 실행할 수 있어요. FILL 벤치마크에는 세 가지 인자가 있어요.

argument sf 10
argument errors 0.1
argument keys 4

FILL의 경우 이들은

  • 스케일 팩터 (파티션당 백만 행)
  • 오류율 (누락된 값의 비율)
  • 파티션 수.

벤치마크는 일반적으로 쿼리를 실행하기 전에 일부 데이터 준비가 필요해요. 데이터 준비는 벤치마크 파일의 load 섹션에서 수행돼요. FILL 벤치마크의 경우 파라미터와 난수 생성기를 사용해 테이블을 만들어요.

load
select setseed(0.8675309);
create or replace table data as (
	select
		k::TINYINT as k,
		(case when random() > ${errors} then m - 1704067200000 else null end) as v,
		m,
	from range(1704067200000, 1704067200000 + ${sf} * 1_000_000 * 10, 10) times(m)
	cross join range(${keys}) keys(k)
);

argument 파라미터는 단위 테스트에서 foreach 값이 확장되는 방식과 유사하게 쿼리에서 확장돼요. load 섹션에서 여러 SQL 문을 실행할 수 있다는 점에 주의해요.

데이터가 준비되면 마침내 벤치마크할 쿼리를 지정할 준비가 됐어요! 이것은 run 섹션에서 수행되며 제한 사항은 단위 테스트와 동일해요 (예: 빈 줄 없음 등). FILL 벤치마크의 경우 보간이 실패하는 모든 위치를 찾고 싶어요.

run
SELECT
	m,
	k,
	fill(v) OVER (PARTITION BY k ORDER BY m) as v
FROM
	data
qualify v <> m - 1704067200000;

보간이 정확하다면 스케일과 무관하게 출력이 없어요. 단위 테스트와 같은 문법을 가진 마지막 result 절로 이를 확인할 수 있어요.

result III

출력 행을 제공하지 않음으로써 쿼리의 정확성뿐만 아니라 성능도 확인할 수 있어요.

최상위 benchmark/ 디렉토리에는 다른 많은 예제가 있으며, 다른 기법을 발견하려면 살펴보는 것이 좋아요.

더 알아보기 (Learn more)