#benchmark #performance #test-suite

app sightglass

一个用于比较相同基元不同实现的基准套件和工具

1 个不稳定版本

0.1.0 2019年4月8日

#244 in 性能分析

Apache-2.0 WITH LLVM-exception OR MIT

555KB
21K SLoC

C 20K SLoC // 0.0% comments Rust 1K SLoC // 0.0% comments JavaScript 56 SLoC // 0.2% comments Vue 17 SLoC Stylus 3 SLoC

包含 (WOFF 字体,58KB) MaterialIcons-Regular.woff,(WOFF 字体,45KB) MaterialIcons-Regular.woff2,(WOFF 字体,20KB) roboto-v18-latin-300.woff,(WOFF 字体,21KB) roboto-v18-latin-500.woff,(WOFF 字体,20KB) roboto-v18-latin-700.woff,(WOFF 字体,20KB) roboto-v18-latin-regular.woff 以及更多

视窗玻璃

一个比较相同基元不同实现的基准套件和工具。

用法

Sight Glass 加载多个实现相同测试套件的共享库,运行所有套件中的所有测试,并生成报告以评估实现之间的比较。

评估每个库中的函数如下

tests_config.global_setup(&global_ctx);

  test1_setup(global_ctx, &test1_ctx);
  test1_body(test1_ctx);
  test1_teardown(test1_ctx);

  test2_setup(global_ctx, &test2_ctx);
  test2_body(test2_ctx);
  test2_teardown(test2_ctx);

  // ...

  testN_setup(global_ctx, &testN_ctx);
  testN_body(testN_ctx);
  testN_teardown(testN_ctx);

tests_config.global_teardown(global_ctx);

每个共享库必须导出名为 tests_config 的符号

typedef struct TestsConfig {
    void     (*global_setup)(void **global_ctx_p);
    void     (*global_teardown)(void *global_ctx);
    uint64_t version;
} TestsConfig;

TestsConfig tests_config;

global_setupglobal_teardown 是可选的,如果不需要,可以设置为 NULL

测试至少必须导出名为 <testname>_body 的函数

void testname_body(void *ctx);

此函数包含要基准测试的实际代码。

默认情况下,ctx 将设置为 global_ctx。但是,也可以为单个测试提供可选的 setupteardown 函数。

void testname_setup(void *global_ctx, void **ctx_p);

void testname_teardown(void *ctx);

有关示例测试套件的示例,请参阅 example/example.c

Sight Glass 提取所有符合上述约定的符号以定义和运行测试套件。

为单个测试运行多个函数

单个测试可以评估共享相同上下文的多个主体函数。

这些函数必须命名为 <testname>_body_<bodyname>

<bodyname> 可以是任何内容;一个数字ID或者对该函数用途的简要描述。

void testname_body_2(void *ctx);
void testname_body_randomized(void *ctx);

这些函数将保证按照它们的名称在字典顺序中进行评估。

配置

全局配置从 sightglass.toml 文件中加载。这可以通过使用 -c 命令行标志来更改。

配置列出了要基准测试的实现

test_suites = [
  { name = "test1", library_path = "implementation1.so" },
  { name = "test2", library_path = "implementation2.so" }
]

单个测试套件也可以运行一个命令,以便在命令返回非零退出代码时可选地跳过

test_suites = [
  { name = "test1", library_path = "implementation1.so" },
  { name = "test2", library_path = "implementation2.so", guard = ["/opt/sg/guard-scripts/check", "arg1", "arg2"] }
]

文件可以包含的其他属性

  • single_core = <bool>:设置为 true 以在单个CPU核心上运行测试,以获得更准确的结果。这仅在Linux上有效。

  • output = [ { format = "Text|CSV|JSON" [, file = <file>] [, breakdown = <bool>] } ... ]:如何存储或显示结果。

默认情况下,TextCSV 输出不包括多函数测试中各个函数花费时间的细分。这可以通过将可选的 breakdown 属性设置为 true 来更改。

JSON 输出始终包含此信息。

依赖关系

~2.5–4MB
~72K SLoC