Skip to content
Yuhui Huang edited this page May 8, 2019 · 1 revision

一台机器运行一个 daemon,每个 daemon 可以有一些 runnerrunner 有不同的种类:

  • compile-runner:专门负责执行编译,编译完成后的文件允许各个 test-runner 读取,也就是说编译生成的文件所在目录是组内只读的
  • test-runner:专门负责测试。支持如下的测试类型:
    1. 标准测试:有设计好的输入输出,由 special judge/diff 来对程序输出进行比较。
    2. 随机测试:出题人提供输入数据的随机生成程序,在每次评测时调用该程序生成输入和输出,再进行标准测试。由于每次进行随机测试都要先调用出题人的数据生成器和标准程序,因此执行速度也比较慢。
    3. 静态测试:静态测试选手程序是否存在问题,如存在漏洞。
    4. 内存测试:内存测试选手程序是否有内存泄漏情况,通常速度比较慢。
    5. 单元测试:出题人提供单元测试对选手程序进行判分。

由于考试题目的类型有别,我们区分情况进行讨论:

OI 赛制题目

广义上的 OI 赛制题目是:有部分分。也就是说一道题的所有测试点都必须进行评测,这种情况下如果评测系统的负载比较小,一个人的评测速度也可能因为打暴力而导致评测速度较慢。因此我们采取不同测试点不同核心运行的策略:一道题,10 个测试点,由不同的 test-runner 负责进行评测。这样的好处就是评测系统负载低时一个人的测试速度可以很快。

优化:对于标准测试,题目的比较器 special_judge 需要在评测前完成编译,由于编译速度比较慢,会拖慢标准测试时间,因此我们要做一个缓存来存储 special_judge 的可执行文件。文件系统将允许手动添加缓存文件,并管理依赖,special_judge 的可执行文件生成后添加进本地缓存系统。此外,随机生成的数据也必须添加进本地缓存系统。所有的 runner 共享一个缓存系统。

Clone this wiki locally