Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

枚举

enum ExplicitGcType

public enum ExplicitGcType <: ToString {
    | Disabled
    | Light
    | Heavy
}

功能:用于指定 @Configure 宏的 explicitGC 配置参数。表示 GC 执行的三种不同方式。

父类型:

Disabled

Disabled

功能:GC 不会被框架显式调用。

Heavy

Heavy

功能:std.runtime.GC(heavy: true) 将在性能测试执行期间由框架显式调用。

Light

Light

功能:std.runtime.GC(heavy: false) 将在 Benchmark 函数执行期间由框架显式调用。这是默认设置。

func toString()

public func toString(): String

功能:GC 执行的三种不同方式字符串。

返回值:

  • String - GC 执行的三种不同方式字符串。

示例:

import std.unittest.*
import std.unittest.testmacro.*
import std.time.*
import std.runtime.*
import std.collection.*

var counter: Float64 = 0.0
var prevGC = 0
var o = Object()

class TestNoGcRunning <: Measurement {
    static var callCounter = 0
    let result: Float64 = 0.0

    public func setup() {
        @Assert(!isGCRunning())
    }

    public func measure(): Float64 {
        counter
    }
}

@Test
@Configure[explicitGC: Light]
class BenchGCLight {
    @BeforeAll
    func before() {
        prevGC = getGCCount()
    } 

    @Bench
    func foo() {
        for (i in 0..1000000) {
            o = ArrayList<Int64>(8)
        }
        counter += 1.0
    }

    @AfterAll
    func after() {
        let diff = getGCCount() - prevGC
        @Assert(diff >= 35) 
        @Assert(diff <= 60)
    }
}

@Test
@Configure[explicitGC: Heavy]
class BenchGCWait {
    @BeforeAll
    func before() {
        prevGC = getGCCount()
    } 

    @Bench
    func foo() {
        for (i in 0..1000000) {
            o = ArrayList<Int64>(8)
        }
        counter += 1.0
    }

    @AfterAll
    func after() {
        let diff = getGCCount() - prevGC
        @Assert(diff >= 45)
    }
}

enum TimeUnit

public enum TimeUnit <: ToString {
    | Nanos
    | Micros
    | Millis
    | Seconds
}

功能:可以在 TimeNow 构造函数中使用的时间单位。

父类型:

Micros

Micros

功能:单位为微秒。

Millis

Millis

功能:单位为毫秒。

Nanos

Nanos

功能:单位为纳秒。

Seconds

Seconds

功能:单位为秒。

func toString()

public func toString(): String

功能: 将时间转换为字符串。

返回值:

  • String - 由四个不同的时间表示组成的字符串。

示例:

import std.time.*
import std.sync.*

@Test
@Measure[TimeNow(TimeUnit.Micros)]
class Test_Configure_Running_Case_01 {
    var count1 = AtomicInt64(0)
    var count2 = AtomicInt64(0)

    @AfterAll
    func afterAll(): Unit {
        @Assert(count1.load() >= 26)
        @Assert(count2.load() >= 101)
    }

    @Bench
    func case01(): Unit {
        sleep(0.95 * Duration.millisecond)
        count1.fetchAdd(1)
    }

    @Bench
    @Configure[batchSize: 10, minBatches: 10]
    func case02(): Unit {
        sleep(0.25 * Duration.millisecond)
        count2.fetchAdd(1)
    }
}

enum PerfCounter

public enum PerfCounter <: ToString {
    | HW_CPU_CYCLES
    | HW_INSTRUCTIONS
    | HW_CACHE_REFERENCES
    | HW_CACHE_MISSES
    | HW_BRANCH_INSTRUCTIONS
    | HW_BRANCH_MISSES
    | HW_BUS_CYCLES
    | HW_STALLED_CYCLES_FRONTEND
    | HW_STALLED_CYCLES_BACKEND
    | HW_REF_CPU_CYCLES
    | SW_CPU_CLOCK
    | SW_TASK_CLOCK
    | SW_PAGE_FAULTS
    | SW_CONTEXT_SWITCHES
    | SW_CPU_MIGRATIONS
    | SW_PAGE_FAULTS_MIN
    | SW_PAGE_FAULTS_MAJ
    | SW_EMULATION_FAULTS
}

功能:枚举 Perf 构造器支持的 CPU 计数器。

有关特定 cpu 计数器的详细信息,请参阅 Linux 内核中 perf_event_open 系统调用的文档。

父类型:

示例:

import std.unittest.*
import std.unittest.testmacro.*
import std.time.*

var counter: Float64 = 0.0

let perf0 = Perf(PerfCounter.HW_CPU_CYCLES)
let perf1 = Perf(PerfCounter.HW_INSTRUCTIONS)
let perf2 = Perf(PerfCounter.HW_CACHE_REFERENCES)
let perf3 = Perf(PerfCounter.HW_CACHE_MISSES)
let perf4 = Perf(PerfCounter.HW_BRANCH_INSTRUCTIONS)
let perf5 = Perf(PerfCounter.HW_BRANCH_MISSES)
let perf6 = Perf(PerfCounter.HW_BUS_CYCLES)
let perf8 = Perf(PerfCounter.HW_STALLED_CYCLES_BACKEND)
let perf9 = Perf(PerfCounter.HW_REF_CPU_CYCLES)
let perf10 = Perf(PerfCounter.SW_CPU_CLOCK)
let perf11 = Perf(PerfCounter.SW_TASK_CLOCK)
let perf12 = Perf(PerfCounter.SW_PAGE_FAULTS)
let perf13 = Perf(PerfCounter.SW_CONTEXT_SWITCHES)
let perf14 = Perf(PerfCounter.SW_CPU_MIGRATIONS)
let perf15 = Perf(PerfCounter.SW_PAGE_FAULTS_MIN)
let perf16 = Perf(PerfCounter.SW_PAGE_FAULTS_MAJ)
let perf17 = Perf(PerfCounter.SW_EMULATION_FAULTS)

@Test
@Measure[perf0, perf1, perf2, perf3, perf4, perf5, perf6, perf8, perf9, perf10, perf11, perf12, perf13, perf14, perf15, perf16, perf17]
class Test_CPU_01 {
    @BeforeEach
    func beforeEach() {
        counter = 0.0
    }
    
    @Bench
    func foo() {
        counter += 1.0
    }
}

HW_CPU_CYCLES

HW_CPU_CYCLES

功能:原始 CPU 周期数。

HW_INSTRUCTIONS

HW_INSTRUCTIONS

功能:退役的 CPU 指令数量。

HW_CACHE_REFERENCES

HW_CACHE_REFERENCES

功能:缓存访问量。

HW_CACHE_MISSES

HW_CACHE_MISSES

功能:缓存未命中数量。

HW_BRANCH_INSTRUCTIONS

HW_BRANCH_INSTRUCTIONS

功能:退役的分支 CPU 指令数量。

HW_BRANCH_MISSES

HW_BRANCH_MISSES

功能:分支预测失败的数量。

HW_BUS_CYCLES

HW_BUS_CYCLES

功能:总线周期数。

HW_STALLED_CYCLES_FRONTEND

HW_STALLED_CYCLES_FRONTEND

功能:CPU 周期被浪费在 CPU 管道前端阶段的等待上的数量。

HW_STALLED_CYCLES_BACKEND

HW_STALLED_CYCLES_BACKEND

功能:CPU 周期被浪费在 CPU 管道后端阶段的等待上的数量。

HW_REF_CPU_CYCLES

HW_REF_CPU_CYCLES

功能:与频率无关的 CPU 周期数。

SW_CPU_CLOCK

SW_CPU_CLOCK

功能:每个 CPU 时钟时间量。

SW_TASK_CLOCK

SW_TASK_CLOCK

功能:每个任务的 CPU 时钟时间量。

SW_PAGE_FAULTS

SW_PAGE_FAULTS

功能:页错误数量。

SW_CONTEXT_SWITCHES

SW_CONTEXT_SWITCHES

功能:操作系统上下文切换的数量。

SW_CPU_MIGRATIONS

SW_CPU_MIGRATIONS

功能:CPU 之间的任务迁移量。

SW_PAGE_FAULTS_MIN

SW_PAGE_FAULTS_MIN

功能:次要页错误数量。

SW_PAGE_FAULTS_MAJ

SW_PAGE_FAULTS_MAJ

功能:主要页错误数量。

SW_EMULATION_FAULTS

SW_EMULATION_FAULTS

功能:需要内核模拟的不受支持的指令数量。

func toString()

public func toString(): String

功能: 将计数器转换为字符串。

返回值:

  • String - 处理器计数器的字符串表示。