为啥带有基于谓词的期望的 XCTest 这么慢?

Posted

技术标签:

【中文标题】为啥带有基于谓词的期望的 XCTest 这么慢?【英文标题】:Why is XCTest with a predicate based expectation so slow?为什么带有基于谓词的期望的 XCTest 这么慢? 【发布时间】:2020-04-09 00:02:57 【问题描述】:

有人知道为什么 XCTest 对谓词的期望如此缓慢吗?在我看来,即使谓词应该立即通过,Swift 和 ObjC 的最短执行时间也是 1 秒。用if !pred.evaluate(with:obj) 包装我的期望将测试执行速度提高了几个数量级。

import XCTest

struct TestObject 
  var value = true


class SwiftPredicateTestTests: XCTestCase 
  func testPerformanceExample() 
    let obj = TestObject()
    self.measure 
      let pred = NSPredicate(evaluatedObject, _) in
        return (evaluatedObject as! TestObject).value
      
      let expect = expectation(for: pred, evaluatedWith: obj, handler: nil)
      wait(for: [expect], timeout: 30)
    
  

measured [Time, seconds] average: 1.013, relative standard deviation: 2.464%, values: [1.087598, 1.002806, 1.003474, 1.001123, 1.004604, 1.007821, 1.004224, 1.005046, 1.005243, 1.007546],

【问题讨论】:

以 FB7657125 提交给 Apple 【参考方案1】:

这种效果在waitForExistence 方法中也很明显。 他们可能在循环条件检查之前使用sleep(1)

【讨论】:

当我将它添加到某些测试的拆解中时,我注意到了这一点,所有 200 个测试都开始花费一秒钟,而不是之前的一小部分。

以上是关于为啥带有基于谓词的期望的 XCTest 这么慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥带有 SourceTree 的 WSL2 上的 Git 对我来说这么慢?

为啥 iframe 这么慢?

为啥 Tkinter 窗口打开这么慢?

为啥这个 jQuery 选择器这么慢?

为啥 ProtoBuf 在第一次调用时这么慢,但在循环内部却非常快?

带有基于依赖属性的谓词的 NSFetchedResultsController