codedang
codedang copied to clipboard
Iris 문제 단위 → 테스트케이스 단위 채점
Describe the problem and solution
기존에는 문제에 있는 n개의 테스트케이스를 iris에서 한번에 채점해서 결과를 반환하는 방식이었습니다. 지금 방식의 문제는 모든 테스트케이스가 채점될 때까지 기다려야 해서 클라이언트 측에서 정보가 바로 업데이트되지 않고, 체감상 더 오래 걸리는 것처럼 느껴진다는 거예요(채점 요청 → 기다림... → n개의 결과 한 번에). 여러 테스트케이스를 처리하고 그 결과를 합치는 로직까지 추가되기 때문에, iris 코드가 다소 복잡해지기도 하죠.
flowchart LR
Backend-- "요청 1개(testcase * n)" -->RabbitMQ-- 요청 1개 -->Iris-->RabbitMQ-->Backend
이 대신 테스트케이스 별로 코드를 실행하고 결과를 반환하도록 합니다. 총 실행 시간을 따지면 조금 더 걸릴 수 있지만, 병렬 처리가 가능하기 때문에 실제 실행 시간은 더 걸리지 않을 것 같아요. (오히려 더 짧아질 수도...!)
flowchart LR
Backend-- "요청 n개(testcase * 1)" -->RabbitMQ-- 요청 1개 -->Iris1-->RabbitMQ-->Backend
RabbitMQ-- 요청 1개 -->Iris2-->RabbitMQ
RabbitMQ-- 요청 1개 -->Iris3-->RabbitMQ
Validations
- [X] Follow our Code of Conduct
- [X] Read the Contributing Guidelines
- [X] Check that there isn't already an issue
장기적으로 봤을 때 코드 실행 기능 등을 추가하는 것을 고려할 때에도 테스트케이스 단위 채점이 효과적입니다!
개선 방안
- 한번의 compile, 여러 번의 채점
- 코드와 testcase, 문제 정보의 조합으로 요청을 보낸다
- 동일한 코드에 대한 여러 testcase 들의 요청들이 쌓일 수 있다.
- 매번 compile 하기 보단 최초 한번의 compile 후 같은 코드의 요청들에 대해서는 미리 compile 한 결과를 이용한다.
- 같은 코드인지 여부는 checksum을 통해 구분한다.
- Compile 명령과 grade 명령
- 0번과 거의 동일
testcase 별로 저장하도록 nest 서버 수정