Hello.
When I try to profile a frame capture of an app running on iPad, I get the following error:
Unexpected Replayer Termination
Abort trap: 6
This is my configuration:
macOS 14.0
Xcode 15.0
iPad Pro (10.5-inch) - A10X
iPadOS 17.2
Is this expected? Is there a way to fix the issue?
Thanks
Performance
RSS for tagImprove your app's performance.
Posts under Performance tag
45 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
MySQLWorkbench crashes every time I try to create a new model database.
Hello everyone,
I need your help with a performance issue I’m encountering in my app.
I’m learning app development in SwiftUI, and I built a simple budgeting app based on the 50/30/20 rule, which consists in dividing your expenses in “Needs”’, “Wants”, and “Savings and debts”. The main objects of my app are months, and transactions, each month containing an array of associated transactions.
My app shows graphs for the current month. For example, it can show a pie chart representing the expenses of different categories.
Now, in order to create these graphs, I have to compute some numbers from the month. For example, I have to retrieve the percent of the budget that has been spent. For now, I did this by adding various computed variables to my MonthBudget model, which is the model containing the transactions. This looks something like this:
@Model
final class MonthBudget {
@Relationship(deleteRule: .cascade) var transactions: [Transaction]? = []
let identifier: UUID = UUID()
var monthlyBudget: Double = 0
var needsBudgetRepartition: Double = 50
var wantsBudgetRepartition: Double = 30
var savingsDebtsBudgetRepartition: Double = 20
// Definition of other variables...
}
extension MonthBudget {
@Transient
var totalSpent: Double {
spentNeedsBudget + spentWantsBudget + spentSavingsDebtsBudget
}
@Transient
var remaining: Double {
totalAvailableFunds + totalSpent
}
// Negative amount spent for a specific category (ex: -250)
@Transient
var spentNeedsBudget: Double { transactions!.filter { $0.category == .needs && $0.amount < 0 }.reduce(0, { $0 + $1.amount }) }
@Transient
var spentWantsBudget: Double { transactions!.filter { $0.category == .wants && $0.amount < 0 }.reduce(0, { $0 + $1.amount }) }
@Transient
var spentSavingsDebtsBudget: Double { transactions!.filter { $0.category == .savingsDebts && $0.amount < 0 }.reduce(0, { $0 + $1.amount }) }
// Definition of multiple other computed properties...
}
Now, this approach worked fine when I only had one or two months with a few transactions in memory. But now that I’m actually using the app, I see serious performance issues (most notably hangs/freezes) whenever I am trying to display a graph.
I used “Instruments” to inspect what was going wrong with my app, and I saw that the hangs happened mostly when trying to get the value of these variables, meaning that the actual computing was taking too long.
I’m therefore trying to find a more efficient way of getting these informations (totalSpent, spentNeedsBudget, etc.). Is there a common practice that would help with these performance issues?
I thought about caching the last computed property (and persist it using SwiftData), and using a function that would re-compute and persist all of these properties whenever a transaction is added or removed. But this has multiple cons:
I’d have to call the function that re-computes the properties and stores them in memory each time I delete/add a transaction, losing the very benefit of using computed properties
This would potentially be a bad idea: if there’s some sort of bug with SwiftData and one or multiple transactions are added or deleted without the user actually doing anything, there could be a mismatch between the persisted amount/value and the actual value.
Did any of you face the same issue as me, and if so, how did you solve it?
Any idea is appreciated!
Thanks for reading so far,
Louis.
Hi, team.
Our team is planning to address the app performance issue of the app. And so far I've found the peer group benchmark for crashes, but couldn't find it for hang rates.
Can I get the data from App Store Connect or is the team planning to provide this data in the near future?
Thank you for reading.
is there a way to debug Metal raytracing intersection functions?
how is that done? i cannot see the intersection functions in the Xcode shader debugger.
Hi,
This topic is about Workgroups.
I create child processes and I'd like to communicate a os_workgroup_t to my child process so they can join the work group as well.
As far as I understand, the os_workgroup_t value is local to the process.
I've found that one can use os_workgroup_copy_port() and os_workgroup_create_with_port(), but I'm not familiar at all with ports and I wonder what would be the minimal effort to achieve that.
Thank you very much!
Alex
I have built an application to measure network throughput using Network.framework. Since the Sonoma Update, I've encountered some strange performance issues with this framework. I use the Loopback Channel by running the server on my Mac itself, which is written in Golang. Before the update, performance was not an issue. After the update, however, the throughput fluctuates significantly.
I started to investigate, I use the following function to parse the data:
connection.receive(minimumIncompleteLength: 1, maximumLength: 32768) {
// My frame parsing code
}
When I use a higher maximumLength, for example, 65536 bytes, it starts to fluctuate, and the received message size for parsing varies between 2.6 Mbytes and 7 Mbytes. However, if the maximumLength is 32768 or lower, and the message size is smaller or larger than this range, then the performance is as expected.
To further isolate the issue, I forced the server to just send messages and removed my frame parsing code, ensuring that the problem is not related to this. This behavior is very peculiar, and I'm unsure how to fix it. Are there others who have experienced similar performance problems? It's worth noting that this issue occurs only with downstream performance, not with upstream.
After creating a basic table the application crashed while running a select query.
Translated Report (Full Report Below)
Process: MySQLWorkbench [1687]
Path: /Applications/MySQLWorkbench.app/Contents/MacOS/MySQLWorkbench
Identifier: com.oracle.workbench.MySQLWorkbench
Version: 8.0.32.CE (1)
Code Type: X86-64 (Translated)
Parent Process: launchd [1]
User ID: 501
Date/Time: 2023-02-02 11:58:46.6293 +0530
OS Version: macOS 13.2 (22D49)
Report Version: 12
Anonymous UUID: 7B20408B-A4BE-478D-8402-4595E3D3D9C4
Time Awake Since Boot: 880 seconds
System Integrity Protection: enabled
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Termination Reason: Namespace SIGNAL, Code 4 Illegal instruction: 4
Terminating Process: exc handler [1687]
Application Specific Backtrace 0:
0 CoreFoundation 0x00007ff8141d3cb3 __exceptionPreprocess + 242
1 libobjc.A.dylib 0x00007ff813d2210a objc_exception_throw + 48
2 CoreFoundation 0x00007ff81426abbe -[NSObject(NSObject) __retain_OA] + 0
3 CoreFoundation 0x00007ff81413eab0 forwarding + 1324
4 CoreFoundation 0x00007ff81413e4f8 _CF_forwarding_prep_0 + 120
5 WBExtras 0x0000000109c371a1 -[MResultsetViewer tableView:willDisplayCell:forTableColumn:row:] + 393
6 AppKit 0x00007ff81753282e -[NSTableView _delegateWillDisplayCell:forColumn:row:] + 104
7 AppKit 0x00007ff817477676 -[NSTableView preparedCellAtColumn:row:] + 1835
8 MySQLWorkbench 0x0000000100bdfa98 -[MGridView preparedCellAtColumn:row:] + 54
9 AppKit 0x00007ff817476e41 -[NSTableView _drawContentsAtRow:column:withCellFrame:] + 42
10 AppKit 0x00007ff817476ac1 -[NSTableView drawRow:clipRect:] + 1638
11 AppKit 0x00007ff81747613c -[NSTableView drawRowIndexes:clipRect:] + 707
12 AppKit 0x00007ff817401cc4 -[NSTableView drawRect:] + 1670
13 AppKit 0x00007ff817334144 _NSViewDrawRect + 121
14 AppKit 0x00007ff817b193c3 -[NSView _recursive:displayRectIgnoringOpacity:inContext:stopAtLayerBackedViews:] + 1810
15 AppKit 0x00007ff817333870 -[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] + 753
16 QuartzCore 0x00007ff81c16db59 CABackingStoreUpdate_ + 254
17 QuartzCore 0x00007ff81c1d13c1 ___ZN2CA5Layer8display_Ev_block_invoke + 53
18 QuartzCore 0x00007ff81c16cd66 -[CALayer _display] + 2275
19 AppKit 0x00007ff8173334c5 -[_NSBackingLayer display] + 462
20 AppKit 0x00007ff8172ab455 -[_NSViewBackingLayer display] + 554
21 QuartzCore 0x00007ff81c16bd08 _ZN2CA5Layer17display_if_neededEPNS_11TransactionE + 900
22 QuartzCore 0x00007ff81c2e56c6 _ZN2CA7Context18commit_transactionEPNS_11TransactionEdPd + 648
23 QuartzCore 0x00007ff81c14cb35 _ZN2CA11Transaction6commitEv + 725
24 AppKit 0x00007ff81734496f __62+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayLink]_block_invoke + 285
25 AppKit 0x00007ff817b5c767 ___NSRunLoopObserverCreateWithHandler_block_invoke + 41
26 CoreFoundation 0x00007ff81415b3e1 CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23
27 CoreFoundation 0x00007ff81415b309 __CFRunLoopDoObservers + 482
28 CoreFoundation 0x00007ff81415a866 __CFRunLoopRun + 877
29 CoreFoundation 0x00007ff814159e7f CFRunLoopRunSpecific + 560
30 HIToolbox 0x00007ff81dfec766 RunCurrentEventLoopInMode + 292
31 HIToolbox 0x00007ff81dfec576 ReceiveNextEventCommon + 679
32 HIToolbox 0x00007ff81dfec2b3 _BlockUntilNextEventMatchingListInModeWithFilter + 70
33 AppKit 0x00007ff8171e5293 _DPSNextEvent + 909
34 AppKit 0x00007ff8171e4114 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1219
35 AppKit 0x00007ff8171d6757 -[NSApplication run] + 586
36 AppKit 0x00007ff8171aa797 NSApplicationMain + 817
37 dyld 0x0000000200ff6310 start + 2432
Kernel Triage:
VM - pmap_enter retried due to resource shortage
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 AppKit 0x7ff81754dc26 -[NSApplication _crashOnException:] + 287
1 AppKit 0x7ff817344bab __62+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayLink]_block_invoke + 857
2 AppKit 0x7ff817b5c767 ___NSRunLoopObserverCreateWithHandler_block_invoke + 41
3 CoreFoundation 0x7ff81415b3e1 CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23
4 CoreFoundation 0x7ff81415b309 __CFRunLoopDoObservers + 482
5 CoreFoundation 0x7ff81415a866 __CFRunLoopRun + 877
6 CoreFoundation 0x7ff814159e7f CFRunLoopRunSpecific + 560
7 HIToolbox 0x7ff81dfec766 RunCurrentEventLoopInMode + 292
8 HIToolbox 0x7ff81dfec576 ReceiveNextEventCommon + 679
9 HIToolbox 0x7ff81dfec2b3 _BlockUntilNextEventMatchingListInModeWithFilter + 70
10 AppKit 0x7ff8171e5293 _DPSNextEvent + 909
11 AppKit 0x7ff8171e4114 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1219
12 AppKit 0x7ff8171d6757 -[NSApplication run] + 586
13 AppKit 0x7ff8171aa797 NSApplicationMain + 817
14 dyld 0x200ff6310 start + 2432
Thread 1:: com.apple.rosetta.exceptionserver
0 runtime 0x7ff7ffc73614 0x7ff7ffc6f000 + 17940
1 runtime 0x7ff7ffc7f530 0x7ff7ffc6f000 + 66864
2 runtime 0x7ff7ffc80f30 0x7ff7ffc6f000 + 73520
Thread 2:
0 runtime 0x7ff7ffc9187c 0x7ff7ffc6f000 + 141436
Hi everyone,
Wondering if you know how the device decide which compute unit (GPU, CPU or ANE) to use when compute units are set to ALL?
I'm working on optimizing a GPT2 model to run on ANE. I ran the performance report for the existing model and the report showed me operators not supported by ANE.
Then I went onto remove these operators and converted the model to CoreML again. This time the performance report showed that every operator is supported by ANE but the device still prefers GPU when the compute units are set to ALL and perfers CPU when the compute units are set to CPU and ANE.
ALL
CPU and ANE
Does anyone know why?
Thank you in advance!
Hi folks, I'm working on converting a GPT2 model to coreml with KV caching enabled.
I have a GPT2 model runinng on GPU with static input shape
It seems once I enable flexible shape (i.e. either range shape or enumerated shape), the model will be run on CPU according to the performance report. I can see new operators being added ( get_shape and general_slice ) and it is not supported by GPU / ANE
Wondering if there's any way to get around this to get the model running on GPU / ANE? How does the machine decide whether to run the model on GPU / Neural Engine?
Thanks!
We are using the CoreBluetooth framework to communicate with a BLE device. We have the requirement to take many RSSI measures over a short span of time.
To obtain these measurements, we call readRSSI on the peripheral object. The behavior we observe is that Core Bluetooth invokes didReadRSSI only once every second. This behavior does not seem to be documented anywhere.
We have found several reports of the same issue, which have not been answered.
For Example:
https://developer.apple.com/forums/thread/698235
https://developer.apple.com/forums/thread/77277
https://stackoverflow.com/questions/61216589/fast-update-rssi-bluetooth-in-ios
The first question would be: Is this the intended behavior? Secondly, is it documented somewhere? And lastly, are there any workarounds that would allow for a higher rate of taking RSSI measurements than 1 per second?
CoreBluetooth will only update the RSSI value for a connected BLE device at least one second after the last call to readRSSI, effectively limiting the rate at which the RSSI value can be read to once every second.
Is this a momentary measurement, or does it represent some kind of average over this one second?
If this is not an average, what is the rationale for limiting the rate at which the RSSI value can be measured?
Rate limitation verified in this thread: https://developer.apple.com/forums/thread/739727
I’m trying to achieve vertical split view in SwiftUI. There are two views, top one is Map (MKMapView actually, wrapped with UIViewRepresentable) and bottom one for this example could be Color.red. Between them there’s a handle to resize the proportions. Initial proportions are 0.3 of height for bottom, 0.7 for map. When resizing map frame, it feels choppy and slow. Replacing MapView with any other view does not produce the same issue.
Issue appears only on my real device (iPhone 11 Pro Max) simulator works fine.
Hi,
I am running Mac Intel I7 post 2020 with Sonoma and clang 15.0 .
The Clang 15.0 makes c++ code running 5 times slower than it was before upgrade from Ventura 13.6 and Clang 14.3.1
The other trouble is that Sonoma does not allow to revert to Clang 14.3.1 . I do not use Xcode only command line tools .
here my options :
g++ -std=c++17 -Ofast -march=native -funroll-loops -flto -DNDEBUG -o a prog.cpp
So what happened to C++ ?
when i use the xcode14.2 CPU Counter tool to detect the process of iphone14Pro, it told me cpu unsupported, can anyone tell the reason?
I noticed that UITextViews get stuck in memory after a preview has been shown. I mean the preview you get when you long press a url.
For this to work editable should be false and dataDetectorTypes should include .link. Include a url to the text and long press it. A preview should show. When you quit the preview and you remove the text view with removeFromSuperView() (or just close the ViewController containing the text view), it won't deinit anymore. You can check by overriding deinit or by checking if a weak reference (like IBOutlet) has become nil.
I also noticed that two system ViewControllers stay in memory too, namely SFSafariViewController and SFBrowserRemoteViewController. I don't know if this is by design.
Tried on iOS 16.2 and 16.3.1.
I use the rendering pipeline urp 12.1.7, and then use the unity2021.3.11f1 version to export the xcode14.2 project, and then run it on the iPhone 11 pro max (16.3), and then click the "M" button to perform gpu capture workload. Once this operation is performed, the memory usage will rise sharply, triggering the out of memory. For example, the memory of the game itself is about 1.3G. Once the gpu capture is performed, it will become more than 2.3G, resulting in the inability to profile the game.
I'm using ScrollView to display my course list, and each card in the list, named 'CourseCardView' as shown in the code. When I test it on both the simulator and a physical device, I notice that scrolling is not smooth and feels laggy. I'm not sure how to address this issue.
Here is my code:
//
// CourseListView.swift
// LexueSwiftUI
//
// Created by bobh on 2023/9/3.
//
import SwiftUI
struct CourseCardView: View {
let cardHeight: CGFloat = 150
let cardCornelRadius: CGFloat = 10
let cardHorizontalPadding: CGFloat = 10
@State var courseName = "course name"
@State var courseCategory = "category name"
@State var progress = 66
var body: some View {
ZStack {
Image("default_course_bg2")
.resizable()
.blur(radius: 5, opaque: true)
.cornerRadius(cardCornelRadius)
.padding(.horizontal, cardHorizontalPadding)
.frame(height: cardHeight)
Color.white
.cornerRadius(cardCornelRadius)
.padding(.horizontal, cardHorizontalPadding)
.frame(height: cardHeight)
.opacity(0.1)
VStack(alignment: .leading, spacing: 2) {
Spacer()
Text(courseName)
.bold()
.font(.title)
.foregroundColor(.white)
.lineLimit(1)
.shadow(color: .black.opacity(0.5), radius: 5, x: 0, y: 2)
.padding(.leading, 10)
Text(courseCategory)
.bold()
.font(.headline)
.foregroundColor(.white)
.lineLimit(1)
.shadow(color: .black.opacity(0.5), radius: 5, x: 0, y: 2)
.padding(.leading, 10)
.padding(.bottom, 5)
ProgressView(value: Double(progress) / 100.0)
.padding(.horizontal, 10)
.padding(.bottom, 10)
.accentColor(.white)
.shadow(color: .black.opacity(0.3), radius: 5, x: 0, y: 2)
}
.frame(height: cardHeight)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, cardHorizontalPadding)
VStack {
HStack {
Spacer()
Button(action: {
}) {
Image(systemName: "star")
.foregroundColor(.white)
.font(.system(size: 24).weight(.regular))
.shadow(color: .black.opacity(0.3), radius: 5, x: 0, y: 2)
}
.padding(.trailing, 10)
.padding(.top, 10)
}
Spacer()
}
.frame(height: cardHeight)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, cardHorizontalPadding)
}
.shadow(color: .black.opacity(0.3), radius: 5, x: 0, y: 2)
}
}
private struct ListView: View {
@Binding var courses: [CourseShortInfo]
@Binding var isRefreshing: Bool
@Environment(\.refresh) private var refreshAction
@ViewBuilder
var refreshToolbar: some View {
if let doRefresh = refreshAction {
if isRefreshing {
ProgressView()
} else {
Button(action: {
Task{
await doRefresh()
}
}) {
Image(systemName: "arrow.clockwise")
}
}
}
}
var body: some View {
VStack {
ScrollView(.vertical) {
LazyVStack(spacing: 20){
ForEach(courses) { item in
CourseCardView(courseName: item.shortname!, courseCategory: item.coursecategory!, progress: item.progress!)
.listRowSeparator(.hidden)
}
}
}
.toolbar {
refreshToolbar
}
}
}
}
struct CourseListView: View {
@State private var courseList = GlobalVariables.shared.courseList
@State var isRefreshing: Bool = false
@State var searchText: String = ""
func testRefresh() async {
Task {
isRefreshing = true
Thread.sleep(forTimeInterval: 1.5)
withAnimation {
isRefreshing = false
}
}
}
var body: some View {
NavigationView {
VStack {
ListView(courses: $courseList, isRefreshing: $isRefreshing)
.refreshable {
print("refresh")
await testRefresh()
}
}
.searchable(text: $searchText, prompt: "Search the course")
.navigationTitle("Course")
.navigationBarTitleDisplayMode(.large)
}
}
}
struct CourseListView_Previews: PreviewProvider {
static var previews: some View {
CourseListView()
}
}
The global variable code:
import Foundation
import SwiftUI
class GlobalVariables {
static let shared = GlobalVariables()
@Published var isLogin = true
@Published var courseList: [CourseShortInfo] = [
CourseShortInfo(id: 11201, shortname: "数据结构与C++程序设计", progress: 66, coursecategory: "自动化学院"),
CourseShortInfo(id: 11202, shortname: "数值分析", progress: 20, coursecategory: "数学学院"),
CourseShortInfo(id: 11203, shortname: "数据结构与C++程序设计", progress: 66, coursecategory: "自动化学院"),
CourseShortInfo(id: 11204, shortname: "数值分析", progress: 20, coursecategory: "数学学院"),
CourseShortInfo(id: 11205, shortname: "数据结构与C++程序设计", progress: 66, coursecategory: "自动化学院"),
CourseShortInfo(id: 11206, shortname: "数值分析", progress: 20, coursecategory: "数学学院"),
CourseShortInfo(id: 11207, shortname: "数据结构与C++程序设计", progress: 66, coursecategory: "自动化学院"),
CourseShortInfo(id: 11208, shortname: "数值分析", progress: 20, coursecategory: "数学学院"),
CourseShortInfo(id: 11209, shortname: "数据结构与C++程序设计", progress: 66, coursecategory: "自动化学院"),
CourseShortInfo(id: 11210, shortname: "数值分析", progress: 20, coursecategory: "数学学院")
]
var debugMode = true
private init() {
}
}
I have an system that is designed around a collection of devices (iPhones or iPads) discovered via bonjour and connected with a NWConnection over TCP. Commands issued from one of the devices are sent to each of the peers and should be executed as soon as they are received.
The problem I am encountering is a high variability in transit time device to device that I am having a hard time accounting for. By 'high' I am noting anywhere from 20-80ms of latency device to device. CPU utilization on each iPhone is essentially 0. Keepalives are enabled and firing off every 2 seconds. Additionally, the physical devices all have bluetooth off (as recommended in other posts)
The interesting part is when I add into the connection mix an iPhone simulator (running on either a M1 MacBook Air, or my M1U Studio). When a command is issued from the simulator instance, all connected devices report back anywhere within ~0-3ms of deviation from the initiator, which is more what I expect from the network.
Thinking that it's perhaps the M1 series of chips being far and away more competent than the A15's in the iPhone 13's and 14 that are in my testbed, I added my M1 iPad to the mix.
Invoking a command from the iPad has similar variability as invoking it from one of the iPhones.
The code is stupid simple and I'm posting here prior to opening up a DTS case in the hope that there's a magic "shouldUseSpeedholes=true" flag I can set. I have gone through several variations: using UDP instead of TCP (worse variations), changing from a listener/browser on each device to a single browser, multiple listener (no difference), changing from keeping things on the main queue (as in the docs) to a separate concurrent high priority dispatch queue (no difference). There is no TLS in the mix. I have tried both allowing peer-to-peer as well as not (no difference). I'm even using a single purpose project instead of my main codebase to isolate everything else that could be messing with scheduling with communications. I've tried each band of my WIFI (2.4 and 2x5ghz SSIDs) - no change.
Sending
func send(option: AppFramingOptions, withData data: Data?) {
let message = NWProtocolFramer.Message(appFramingOption: option)
let context = NWConnection.ContentContext(identifier: "\(option.rawValue)", metadata: [message])
for (uniqueKey, connection) in connections {
if uniqueKey.contains(serviceName) {
connection.send(content: data, contentContext: context, isComplete: true, completion: .idempotent)
}
}
}
In the above function, I am looking for the serviceName because I want to use connections connected via the browser as opposed to the listener (which isn't tagged with service name info in the endpoint). The check avoids a device receiving the command twice.
Receiving
connection.receiveMessage { content, contentContext, isComplete, error in
guard error == nil else {
connection.cancel()
return
}
if let msg = contentContext?.protocolMetadata(definition: AppFraming.definition) as? NWProtocolFramer.Message {
switch msg.appFramingOption {
default:
self.messageReceivedHandler?(content, msg.appFramingOption, Date().timeIntervalSince1970, withUniqueKey)
}
}
receiveMessage()
}
}
It's very much patterned off the TicTacToe example code (with a mechanism for multiple connections).
My next step is embedding a web server in each device and making REST calls rather than commands over a TCP stream (which is CRAZY INSANE I KNOW). I also do not want to have to have a Macintosh dependency for this system because I cannot get predictable(ish) transit times.
Any help is appreciated!
Is there a way to sample performance monitoring counters (PMC) using ktrace utility?
kperf sources contain some evidences of a PMC sampler presence (https://github.com/apple-oss-distributions/xnu/blob/main/osfmk/kperf/action.h#L48).
Maybe there is a way to specify it as ktrace artrace's --kperf sampler along with counters to sample?