tiny.coz.Profiler
Defined in profiler.
API (40)
Actions
Public operations.
addSourceRangebeginExperimentcatchUpclearNextLinecreditSelectedHitdeinitdrainPerfEventdrainPerfRingdrainResolvedPerfRingdrainResolvedSamplerdrainSamplerfinishExperimentgetCounternextLineobservePerfRecordobserveResolvedPerfRecordobserveResolvedSampleobserveSamplepostBlockpreBlockprocessPerfEventprocessPerfRingprocessSamplerrunExperimentrunExperimentStepsamplingSnapshotselectLineselectedLinewriteRuntimewriteRuntimeAndSampleswriteSamplewriteStartup
Fields and members
Public fields and members.
delaysexperiment_duration_nsnext_line_addressregistrysamplingselected_line_addresssource_mutexsources
Source
Source: lib/coz/src/profiler.zig:58
zig
pub const Profiler = struct { registry: registry_mod.Registry = .{}, sources: source_map.Index = .{}, source_mutex: std.atomic.Mutex = .unlocked, delays: delay.Coordinator = .{}, selected_line_address: std.atomic.Value(usize) = .init(0), next_line_address: std.atomic.Value(usize) = .init(0), sampling: SamplingCounters = .{}, experiment_duration_ns: u64 = experiment.experiment_min_time_ns, pub fn deinit(self: *Profiler, allocator: std.mem.Allocator) void { self.registry.deinit(allocator); self.sources.deinit(allocator); self.delays = .{}; self.selected_line_address.store(0, .release); self.next_line_address.store(0, .release); self.sampling = .{}; self.experiment_duration_ns = experiment.experiment_min_time_ns; } pub fn getCounter( self: *Profiler, allocator: std.mem.Allocator, kind: abi.CounterKind, name: []const u8, ) !*abi.Counter { return self.registry.getCounter(allocator, kind, name); } pub fn preBlock(self: *Profiler, thread: *delay.ThreadState) void { self.delays.preBlock(thread); } pub fn catchUp(self: *Profiler, thread: *delay.ThreadState, wait: anytype) u64 { return self.delays.addDelays(thread, wait); } pub fn postBlock(self: *Profiler, thread: *delay.ThreadState, skip_delays: bool) void { self.delays.postBlock(thread, skip_delays); } pub fn creditSelectedHit(self: *Profiler, thread: *delay.ThreadState) void { self.delays.creditSelectedHit(thread); } pub fn addSourceRange( self: *Profiler, allocator: std.mem.Allocator, filename: []const u8, line_no: u64, range: source_map.Interval, ) !*source_map.Line { lockMutex(&self.source_mutex); defer self.source_mutex.unlock(); return self.sources.addRange(allocator, filename, line_no, range); } pub fn selectLine(self: *Profiler, line: ?*source_map.Line) void { self.selected_line_address.store(lineAddress(line), .release); self.clearNextLine(); } pub fn selectedLine(self: *const Profiler) ?*source_map.Line { return addressLine(self.selected_line_address.load(.acquire)); } pub fn clearNextLine(self: *Profiler) void { self.next_line_address.store(0, .release); } pub fn nextLine(self: *const Profiler) ?*source_map.Line { return addressLine(self.next_line_address.load(.acquire)); } pub fn observeSample(self: *Profiler, thread: *delay.ThreadState, sample: source_map.Sample) source_map.Match { if (!self.source_mutex.tryLock()) return .{}; defer self.source_mutex.unlock(); return self.observeSampleLocked(thread, sample); } fn observeSampleLocked(self: *Profiler, thread: *delay.ThreadState, sample: source_map.Sample) source_map.Match { const matched = self.sources.matchSample(sample, self.selectedLine()); if (matched.line) |line| { line.addSample(); if (self.delays.active()) { if (matched.selected_hit) self.creditSelectedHit(thread); } else if (!path_filter.isCozHeader(line.file.name)) { _ = self.next_line_address.cmpxchgStrong(0, lineAddress(line), .acq_rel, .acquire); } } return matched; } pub fn observeResolvedSample( self: *Profiler, allocator: std.mem.Allocator, thread: *delay.ThreadState, sample: source_map.Sample, scope: debug_info.Scope, ) !source_map.Match { lockMutex(&self.source_mutex); defer self.source_mutex.unlock(); try debug_info.resolveSample(allocator, &self.sources, sample, scope); return self.observeSampleLocked(thread, sample); } pub fn observePerfRecord( self: *Profiler, thread: *delay.ThreadState, record: perf.Record, callchain_scratch: []usize, ) !source_map.Match { try self.observePerfRecordKind(record); const sample = try sampleFromPerfRecord(record, callchain_scratch) orelse return .{}; return self.observeSample(thread, sample); } pub fn observeResolvedPerfRecord( self: *Profiler, allocator: std.mem.Allocator, thread: *delay.ThreadState, record: perf.Record, callchain_scratch: []usize, scope: debug_info.Scope, ) !source_map.Match { try self.observePerfRecordKind(record); const sample = try sampleFromPerfRecord(record, callchain_scratch) orelse return .{}; lockMutex(&self.source_mutex); defer self.source_mutex.unlock(); _ = debug_info.resolveSelfAddress(allocator, &self.sources, sample.ip, scope) catch |err| switch (err) { error.OutOfMemory => return err, else => null, }; return self.observeSampleLocked(thread, sample); } pub fn samplingSnapshot(self: *const Profiler) SamplingSnapshot { return .{ .record_count = self.sampling.record_count.load(.acquire), .sample_record_count = self.sampling.sample_record_count.load(.acquire), .lost_record_count = self.sampling.lost_record_count.load(.acquire), .lost_event_count = self.sampling.lost_event_count.load(.acquire), .lost_samples_record_count = self.sampling.lost_samples_record_count.load(.acquire), .lost_samples_count = self.sampling.lost_samples_count.load(.acquire), .throttle_record_count = self.sampling.throttle_record_count.load(.acquire), .unthrottle_record_count = self.sampling.unthrottle_record_count.load(.acquire), }; } fn observePerfRecordKind(self: *Profiler, record: perf.Record) !void { addAtomic(&self.sampling.record_count, 1); switch (record.recordType()) { .sample => addAtomic(&self.sampling.sample_record_count, 1), .lost => { addAtomic(&self.sampling.lost_record_count, 1); addAtomic(&self.sampling.lost_event_count, try record.getLostCount()); }, .lost_samples => { addAtomic(&self.sampling.lost_samples_record_count, 1); addAtomic(&self.sampling.lost_samples_count, try record.getLostCount()); }, .throttle => addAtomic(&self.sampling.throttle_record_count, 1), .unthrottle => addAtomic(&self.sampling.unthrottle_record_count, 1), else => {}, } } pub fn drainPerfRing( self: *Profiler, thread: *delay.ThreadState, reader: *perf.RingReader, record_scratch: []u8, callchain_scratch: []usize, ) !usize { var records: usize = 0; while (try reader.next(record_scratch)) |record| { _ = try self.observePerfRecord(thread, record, callchain_scratch); records += 1; } return records; } pub fn drainResolvedPerfRing( self: *Profiler, allocator: std.mem.Allocator, thread: *delay.ThreadState, reader: *perf.RingReader, record_scratch: []u8, callchain_scratch: []usize, scope: debug_info.Scope, ) !usize { var records: usize = 0; while (try reader.next(record_scratch)) |record| { _ = try self.observeResolvedPerfRecord(allocator, thread, record, callchain_scratch, scope); records += 1; } return records; } pub fn processPerfRing( self: *Profiler, thread: *delay.ThreadState, reader: *perf.RingReader, record_scratch: []u8, callchain_scratch: []usize, wait: anytype, ) !usize { const records = try self.drainPerfRing(thread, reader, record_scratch, callchain_scratch); _ = self.catchUp(thread, wait); return records; } pub fn drainPerfEvent( self: *Profiler, thread: *delay.ThreadState, event: *perf.Event, record_scratch: []u8, callchain_scratch: []usize, ) !usize { var reader = event.ringReader() orelse return 0; const records = try self.drainPerfRing(thread, &reader, record_scratch, callchain_scratch); event.commitReader(reader); return records; } pub fn processPerfEvent( self: *Profiler, thread: *delay.ThreadState, event: *perf.Event, record_scratch: []u8, callchain_scratch: []usize, wait: anytype, ) !usize { var reader = event.ringReader() orelse { _ = self.catchUp(thread, wait); return 0; }; const records = try self.processPerfRing(thread, &reader, record_scratch, callchain_scratch, wait); event.commitReader(reader); return records; } pub fn drainSampler( self: *Profiler, thread: *delay.ThreadState, sampler: *sampler_mod.Sampler, record_scratch: []u8, callchain_scratch: []usize, ) !usize { var reader = sampler.ringReader() orelse return 0; const records = try self.drainPerfRing(thread, &reader, record_scratch, callchain_scratch); sampler.commitReader(reader); return records; } pub fn drainResolvedSampler( self: *Profiler, allocator: std.mem.Allocator, thread: *delay.ThreadState, sampler: *sampler_mod.Sampler, record_scratch: []u8, callchain_scratch: []usize, scope: debug_info.Scope, ) !usize { var reader = sampler.ringReader() orelse return 0; const records = try self.drainResolvedPerfRing(allocator, thread, &reader, record_scratch, callchain_scratch, scope); sampler.commitReader(reader); return records; } pub fn processSampler( self: *Profiler, thread: *delay.ThreadState, sampler: *sampler_mod.Sampler, record_scratch: []u8, callchain_scratch: []usize, wait: sampler_mod.WaitFn, ) !usize { const paused_wait = sampler.pausingWait(wait); var reader = sampler.ringReader() orelse { _ = self.catchUp(thread, paused_wait); return 0; }; const records = try self.processPerfRing(thread, &reader, record_scratch, callchain_scratch, paused_wait); sampler.commitReader(reader); return records; } pub fn beginExperiment( self: *Profiler, allocator: std.mem.Allocator, selected: profile.Location, virtual_speedup: f64, ) !Run { const selected_file = try allocator.dupe(u8, selected.file); errdefer allocator.free(selected_file); const throughput_snapshots = try self.registry.saveThroughputSnapshots(allocator); errdefer allocator.free(throughput_snapshots); const latency_snapshots = try self.registry.saveLatencySnapshots(allocator); errdefer allocator.free(latency_snapshots); return .{ .selected = .{ .file = selected_file, .line = selected.line, }, .virtual_speedup = virtual_speedup, .throughput_snapshots = throughput_snapshots, .latency_snapshots = latency_snapshots, }; } pub fn finishExperiment( self: *Profiler, writer: *std.Io.Writer, run: Run, duration_ns: u64, selected_samples: u64, ) !bool { const min_delta = run.minDelta(); self.experiment_duration_ns = experiment.adjustDuration(self.experiment_duration_ns, min_delta); if (min_delta < experiment.experiment_target_delta) return false; try run.writeEvents(writer, duration_ns, selected_samples); return true; } pub fn runExperiment( self: *Profiler, allocator: std.mem.Allocator, writer: *std.Io.Writer, options: ExperimentRunOptions, wait_fn: sampler_mod.WaitFn, ) !bool { var run = try self.beginExperiment( allocator, options.selected.location(), options.plan.virtual_speedup, ); defer run.deinit(allocator); const starting_samples = options.selected.sampleCount(); const starting_delay_ns = self.delays.globalDelay(); self.selectLine(options.selected); self.delays.startExperiment(options.plan.delay_size_ns); const elapsed_ns = waitForExperiment(options.plan.duration_ns, options.end_to_end, options.running, wait_fn); self.delays.finishExperiment(); self.selectLine(null); const inserted_delay_ns = self.delays.globalDelay() -| starting_delay_ns; const selected_samples = options.selected.sampleCount() -| starting_samples; const duration_ns = experiment.correctedDurationNs(elapsed_ns, inserted_delay_ns, self.delays.overshoot()); return self.finishExperiment(writer, run, duration_ns, selected_samples); } pub fn runExperimentStep( self: *Profiler, allocator: std.mem.Allocator, writer: *std.Io.Writer, options: ExperimentStepOptions, wait_fn: sampler_mod.WaitFn, ) !ExperimentStepResult { const selected = options.fixed_line orelse self.nextLine() orelse return .{}; const plan = try self.stepPlan(options); const emitted = try self.runExperiment( allocator, writer, .{ .selected = selected, .plan = plan, .end_to_end = options.end_to_end, .running = options.running, }, wait_fn, ); return .{ .selected = selected, .emitted = emitted }; } fn stepPlan(self: *const Profiler, options: ExperimentStepOptions) !experiment.Plan { const delay_size_ns = if (options.fixed_speedup_percent) |percent| experiment.fixedDelaySize(percent) orelse return error.InvalidFixedSpeedup else blk: { const draw = try experiment.Draw.init(options.draw.value); break :blk experiment.delaySizeFromDraw(draw); }; return .{ .delay_size_ns = delay_size_ns, .virtual_speedup = experiment.virtualSpeedupFromDelay(delay_size_ns), .duration_ns = self.experiment_duration_ns, }; } pub fn writeStartup(_: *Profiler, writer: *std.Io.Writer, timestamp_ns: u64) !void { try (profile.Event{ .startup = .{ .timestamp_ns = timestamp_ns } }).writeJsonLine(writer); } pub fn writeRuntime(_: *Profiler, writer: *std.Io.Writer, duration_ns: u64) !void { try (profile.Event{ .runtime = .{ .duration_ns = duration_ns } }).writeJsonLine(writer); } pub fn writeSample(_: *Profiler, writer: *std.Io.Writer, location: profile.Location, count: u64) !void { try (profile.Event{ .sample = .{ .location = location, .count = count } }).writeJsonLine(writer); } pub fn writeRuntimeAndSamples( self: *Profiler, allocator: std.mem.Allocator, writer: *std.Io.Writer, duration_ns: u64, loss_counter: profile.LossCounter, terminal_status: profile.TerminalStatus, ) !void { const sample_lines = try self.collectSampleLines(allocator); defer allocator.free(sample_lines); try self.writeRuntime(writer, duration_ns); try (profile.Event{ .sampling = self.profileSampling( loss_counter, terminal_status, ) }).writeJsonLine(writer); for (sample_lines) |line| { try self.writeSample(writer, line.location(), line.sampleCount()); } } fn profileSampling( self: *const Profiler, loss_counter: profile.LossCounter, terminal_status: profile.TerminalStatus, ) profile.Sampling { const snapshot = self.samplingSnapshot(); return .{ .record_count = snapshot.record_count, .sample_record_count = snapshot.sample_record_count, .lost_record_count = snapshot.lost_record_count, .lost_event_count = snapshot.lost_event_count, .lost_samples_record_count = snapshot.lost_samples_record_count, .lost_samples_count = snapshot.lost_samples_count, .throttle_record_count = snapshot.throttle_record_count, .unthrottle_record_count = snapshot.unthrottle_record_count, .loss_counter = loss_counter, .terminal_status = terminal_status, }; } fn collectSampleLines(self: *Profiler, allocator: std.mem.Allocator) ![]*source_map.Line { var sample_lines: std.ArrayListUnmanaged(*source_map.Line) = .empty; errdefer sample_lines.deinit(allocator); lockMutex(&self.source_mutex); defer self.source_mutex.unlock(); var file_iter = self.sources.files.valueIterator(); while (file_iter.next()) |file| { var line_iter = file.*.lines.valueIterator(); while (line_iter.next()) |line| { if (line.*.sampleCount() != 0) try sample_lines.append(allocator, line.*); } } std.mem.sort(*source_map.Line, sample_lines.items, {}, sampleLineLessThan); return try sample_lines.toOwnedSlice(allocator); }};Source: lib/coz/src/root.zig:60
zig
pub const Profiler = profiler.Profiler;Complete caller list for Profiler.addSourceRange
11 direct callers.
lib.coz.src.profiler.test_profiler_does_not_select_coz_header_samples_as_the_next_experiment_line[function] — test source atlib/coz/src/profiler.zig:1344in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_drains_perf_ring_records_into_source_samples[function] — test source atlib/coz/src/profiler.zig:1185in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_experiment_step_can_use_a_fixed_line_and_fixed_speedup[function] — test source atlib/coz/src/profiler.zig:914in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_experiment_step_rejects_invalid_fixed_speedups[function] — test source atlib/coz/src/profiler.zig:964in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_experiment_step_uses_the_sampled_next_line[function] — test source atlib/coz/src/profiler.zig:881in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_observes_active_selected_samples_and_credits_delay[function] — test source atlib/coz/src/profiler.zig:1326in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_observes_decoded_perf_sample_records[function] — test source atlib/coz/src/profiler.zig:1093in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_observes_idle_samples_and_selects_the_next_non-header_line[function] — test source atlib/coz/src/profiler.zig:1310in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_processes_perf_ring_samples_before_applying_delays[function] — test source atlib/coz/src/profiler.zig:1220in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_runs_an_experiment_cycle_and_clears_selected_state[function] — test source atlib/coz/src/profiler.zig:846in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_writes_runtime_and_sorted_nonzero_source_samples[function] — test source atlib/coz/src/profiler.zig:1054in nearest public ownertiny.coz.profiler
Complete caller list for Profiler.deinit
33 direct callers.
lib.coz.src.profiler.test_profiler_attributes_a_sample_after_debug_symbol_resolution[function] — test source atlib/coz/src/profiler.zig:1030in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_audits_perf_loss_and_throttle_records[function] — test source atlib/coz/src/profiler.zig:1122in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_does_not_select_coz_header_samples_as_the_next_experiment_line[function] — test source atlib/coz/src/profiler.zig:1344in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_drains_perf_ring_records_into_source_samples[function] — test source atlib/coz/src/profiler.zig:1185in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_drains_zero_records_from_unmapped_perf_event[function] — test source atlib/coz/src/profiler.zig:1251in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_drains_zero_records_from_unopened_sampler[function] — test source atlib/coz/src/profiler.zig:1264in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_experiment_step_can_use_a_fixed_line_and_fixed_speedup[function] — test source atlib/coz/src/profiler.zig:914in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_experiment_step_is_inert_without_a_selectable_line[function] — test source atlib/coz/src/profiler.zig:945in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_experiment_step_rejects_invalid_fixed_speedups[function] — test source atlib/coz/src/profiler.zig:964in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_experiment_step_uses_the_sampled_next_line[function] — test source atlib/coz/src/profiler.zig:881in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_exposes_delay_accounting_for_blocking_hooks[function] — test source atlib/coz/src/profiler.zig:1294in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_ignores_inactive_progress_points_when_gating_experiment_output[function] — test source atlib/coz/src/profiler.zig:797in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_observes_active_selected_samples_and_credits_delay[function] — test source atlib/coz/src/profiler.zig:1326in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_observes_decoded_perf_sample_records[function] — test source atlib/coz/src/profiler.zig:1093in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_observes_idle_samples_and_selects_the_next_non-header_line[function] — test source atlib/coz/src/profiler.zig:1310in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_processes_perf_ring_samples_before_applying_delays[function] — test source atlib/coz/src/profiler.zig:1220in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_processes_unopened_sampler_by_applying_pending_delay[function] — test source atlib/coz/src/profiler.zig:1277in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_rejects_perf_callchains_that_exceed_scratch_space[function] — test source atlib/coz/src/profiler.zig:1166in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_runs_an_experiment_cycle_and_clears_selected_state[function] — test source atlib/coz/src/profiler.zig:846in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_suppresses_experiment_output_when_no_progress_points_exist[function] — test source atlib/coz/src/profiler.zig:827in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_suppresses_low-delta_experiment_output_and_lengthens_duration[function] — test source atlib/coz/src/profiler.zig:774in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_writes_runtime_and_sorted_nonzero_source_samples[function] — test source atlib/coz/src/profiler.zig:1054in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_writes_startup_runtime_and_sample_events[function] — test source atlib/coz/src/profiler.zig:1011in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_writes_structured_experiment_events_from_registry_snapshots[function] — test source atlib/coz/src/profiler.zig:743in nearest public ownertiny.coz.profilertiny.coz.Runtime.stop[method] atlib/coz/src/runtime.zig:128lib.coz.src.runtime.test_a_profiler_reinstalled_at_a_released_address_resolves_fresh_counters[function] — test source atlib/coz/src/runtime.zig:587in nearest public ownerlib.coz.src.runtimelib.coz.src.runtime.test_compile-time_progress_and_latency_counters_increment_Coz_counters[function] — test source atlib/coz/src/runtime.zig:558in nearest public ownerlib.coz.src.runtimelib.coz.src.runtime.test_default_progress_name_uses_the_callsite_source_location[function] — test source atlib/coz/src/runtime.zig:609in nearest public ownerlib.coz.src.runtimelib.coz.src.runtime.test_installed_profiler_is_visible_to_sampling_signal_handler_without_lock[function] — test source atlib/coz/src/runtime.zig:683in nearest public ownerlib.coz.src.runtimelib.coz.src.runtime.test_installed_profiler_receives_blocking_hooks[function] — test source atlib/coz/src/runtime.zig:1048in nearest public ownerlib.coz.src.runtimelib.coz.src.runtime.test_installed_profiler_receives_marker_counters[function] — test source atlib/coz/src/runtime.zig:661in nearest public ownerlib.coz.src.runtimelib.coz.src.runtime.test_sampling_signal_handler_processes_current_thread_state[function] — test source atlib/coz/src/runtime.zig:696in nearest public ownerlib.coz.src.runtimelib.coz.src.runtime.test_scope_pairs_begin_and_end_counters[function] — test source atlib/coz/src/runtime.zig:624in nearest public ownerlib.coz.src.runtime
Complete caller list for Profiler.observeSample
7 direct callers.
tiny.coz.Profiler.observePerfRecord[method] atlib/coz/src/profiler.zig:166lib.coz.src.profiler.test_profiler_attributes_a_sample_after_debug_symbol_resolution[function] — test source atlib/coz/src/profiler.zig:1030in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_does_not_select_coz_header_samples_as_the_next_experiment_line[function] — test source atlib/coz/src/profiler.zig:1344in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_experiment_step_uses_the_sampled_next_line[function] — test source atlib/coz/src/profiler.zig:881in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_observes_active_selected_samples_and_credits_delay[function] — test source atlib/coz/src/profiler.zig:1326in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_observes_idle_samples_and_selects_the_next_non-header_line[function] — test source atlib/coz/src/profiler.zig:1310in nearest public ownertiny.coz.profilerlib.coz.src.profiler.test_profiler_writes_runtime_and_sorted_nonzero_source_samples[function] — test source atlib/coz/src/profiler.zig:1054in nearest public ownertiny.coz.profiler
Complete call list for Profiler.runExperiment
9 direct calls.
tiny.coz.delay.Coordinator.finishExperiment[method] atlib/coz/src/delay.zig:39tiny.coz.delay.Coordinator.globalDelay[method] atlib/coz/src/delay.zig:47tiny.coz.delay.Coordinator.overshoot[method] atlib/coz/src/delay.zig:55tiny.coz.delay.Coordinator.startExperiment[method] atlib/coz/src/delay.zig:33tiny.coz.experiment.correctedDurationNs[function] atlib/coz/src/experiment.zig:64tiny.coz.Profiler.beginExperiment[method] atlib/coz/src/profiler.zig:351tiny.coz.Profiler.finishExperiment[method] atlib/coz/src/profiler.zig:377tiny.coz.Profiler.selectLine[method] atlib/coz/src/profiler.zig:116lib.coz.src.profiler.waitForExperiment[function] — private source atlib/coz/src/profiler.zig:655in nearest public ownertiny.coz.profiler
Audit
| Definitions | 33 |
|---|---|
| Public names | 66 |
| Members | 8 |
| Version | 26.7.0 |
| Revision | daab053ee433 |