저자의 Rust Platform Django 테스트 스위트는 처음에는 30초가 걸렸고, 이는 데이터베이스 성능에 대한 직감을 불러일으켰습니다. 그러나 cProfile을 사용한 프로파일링 결과 실제 병목 현상은 데이터베이스와 관련이 없다는 것이 밝혀졌고, 실행 시간은 3초로 단축되었습니다. 이 글은 너무 많은 fixture나 데이터베이스 느림과 같은 해결책을 추측하는 대신 성능을 측정하는 것의 중요성을 강조합니다. 특정 병목 현상을 식별하기 위해 cProfile과 같은 프로파일링 도구를 사용할 것을 권장합니다. 저자는 cProfile을 사용하여 pstats 파일을 생성한 다음 profiling-explorer를 사용하여 데이터를 시각화했습니다. 프로파일러는 Django의 기본 비밀번호 해셔인 _hashlib.pbkdf2_hmac 함수가 테스트 중에 과도한 시간을 소비하고 있음을 강조했습니다. 이 해셔는 무차별 대입 공격에 저항하기 위해 의도적으로 느리게 만들어졌지만, 사용자를 생성하는 모든 테스트를 불필요하게 느리게 만듭니다. 테스트 전용으로 더 빠른 MD5 해셔로 전환하여 간단한 다섯 줄의 수정이 구현되었습니다. 이 변경은 매우 효과적이었고 테스트 스위트 실행 시간을 크게 단축했습니다. 이 초기 최적화 후, 다음으로 가장 시간이 많이 소요되는 함수는 cursor.execute였으며, 이는 처음에 잠재적인 N+1 쿼리 문제처럼 보였습니다. 그러나 추가 측정 결과 N+1 쿼리가 발생하지 않았음을 확인했습니다. 높은 호출 수는 합법적인 테스트 설정 작업에 기인했습니다. 이 경험은 핵심 메시지를 강화합니다. 낭비되는 노력과 잘못된 가정을 피하기 위해 최적화하기 전에 항상 프로파일링하십시오.
_hashlib.pbkdf2_hmac함수가 테스트 중에 과도한 시간을 소비하고 있음을 강조했습니다. 이 해셔는 무차별 대입 공격에 저항하기 위해 의도적으로 느리게 만들어졌지만, 사용자를 생성하는 모든 테스트를 불필요하게 느리게 만듭니다. 테스트 전용으로 더 빠른 MD5 해셔로 전환하여 간단한 다섯 줄의 수정이 구현되었습니다. 이 변경은 매우 효과적이었고 테스트 스위트 실행 시간을 크게 단축했습니다. 이 초기 최적화 후, 다음으로 가장 시간이 많이 소요되는 함수는cursor.execute였으며, 이는 처음에 잠재적인 N+1 쿼리 문제처럼 보였습니다. 그러나 추가 측정 결과 N+1 쿼리가 발생하지 않았음을 확인했습니다. 높은 호출 수는 합법적인 테스트 설정 작업에 기인했습니다. 이 경험은 핵심 메시지를 강화합니다. 낭비되는 노력과 잘못된 가정을 피하기 위해 최적화하기 전에 항상 프로파일링하십시오.