ios - Xcode XCTest 使用异步队列测量性能
问题描述
我为我的应用程序编写的框架会下载不同的数据块并进行处理。自然,更大的数据集需要更多的时间来处理。为了更好地研究如何改进,我考虑编写测试来衡量性能,看看哪里/是否值得研究。
通常,measure
块工作,但是,为了避免阻塞主线程,我异步处理数据。因此,我无法测量“从头到尾”,因为该measure
块忽略异步块并在我的异步队列完成处理所有数据之前完成测试。
我写了一个最小的例子来说明我的意思。
DownloadHandler
是在我的框架中接收数据的类。Database
是我的应用程序和模型中的一个类,数据最终会在其中得到处理。在我的应用程序中,AppDelegate 连接了这两者,但为了测试,Test 类在这种情况下执行此操作。
这是正在发生的事情的控制台输出:
File A
Sent A to Database
File B
Sent B to Database
File C
Processed file A in Database
Processed file B in Database
Sent C to Database
[End of Test]
但我需要的是等待测试让队列在停止之前完成所有数据的处理。换句话说,它缺少决赛
Processed file B in Database
您将在下面找到我的示例代码来演示。对于不同目的的不同处理程序,实际实现要复杂得多,但我用usleep
下载处理程序.swift
import Foundation
public protocol HandlerDelegate {
func interpretData(s: Character)
}
class DownloadHandler {
var delegate: HandlerDelegate!
func receivedFiles(files: String) {
for file in files {
print("\nFile \(file)")
usleep(100000)
delegate.interpretData(s: file)
print("Sent \(file) to database")
}
}
}
数据库.swift
class Database {
let serialQueue = DispatchQueue(label: "databaseSerial")
var entries = [Character]()
func interpretData(s: Character) {
serialQueue.async {
usleep(100000)
self.entries.append(s)
print(" Processed file \(s) in database")
}
}
}
TestFrameworkTests.swift
import XCTest
@testable import TestFramework
class TestFrameworkTests: XCTestCase, HandlerDelegate {
func interpretData(s: Character) {
database.interpretData(s: s)
}
var handler = DownloadHandler()
var database = Database()
var testData = "ABC"
func testPerformanceExample() throws {
handler.delegate = self
let options = XCTMeasureOptions()
options.iterationCount = 0
measure(options: options) {
print("\n\nTEST ITERATION")
handler.receivedFiles(files: testData)
}
}
}
我想有一些我不知道的 XCTest 功能,但我无法围绕要搜索的内容来寻找我可以适应的东西。
解决方案
推荐阅读
- mongodb - 如何从聚合(重新)分组中的第一个文档中复制所有字段
- excel - 根据今天的日期更改单元格的值
- c# - 我无法理解如何在 c# 中使用正则表达式或如何解决我的问题
- python - 为什么使用拆分功能后我的列表为空?
- java - 有没有办法查询用户是否存在于基于 SAML 的身份提供者中?
- reactjs - 如何在airbnb日历中添加多个阻塞日期颜色?
- azure-devops - 使用 azure rest api 添加对测试计划、测试套件、测试用例不起作用“ShallowReference”的测试结果
- python - 在 Google Colab 中使用 plotly 绘制超过 6M 行的数据集
- html - 如何使 Bootstrap 4 禁用输入看起来与常规输入相同?
- if-statement - 为什么我的 Lua if-else 不能正常工作?