我有一个使用各种枚举器(例如目录枚举器)迭代数万条记录的应用程序
我看到操作系统X说我的进程是"抓住了燃烧的CPU"因为它占用了大量的CPU。
我想做的是建立一个压力阀"比如
[NSThread sleepForTimeInterval:cpuDelay];
不会阻止像双核机器这样的其他进程/线程。
我的处理是在一个单独的线程上进行的,但是我无法突破并重新进入枚举器循环并使用NSTimers来让机器“呼吸”#34;
任何建议 - [NSThread sleepForTimeInterval:cpuDelay];
应该有效吗?
我在调度队列中运行这些东西:
if(!primaryTask)primaryTask=dispatch_queue_create( "com.me.app.task1",backgroundPriorityAttr);
dispatch_async(primaryTask,^{
[self doSync];
});
答案 0 :(得分:0)
尝试在NSOperation中包装处理并设置较低的QoS优先级。这里有更多信息: http://nshipster.com/nsoperation/
这是我编写的代码示例。在视图加载事件中触发操作:
let processingQueue = NSOperationQueue()
override func viewDidLoad() {
let backgroundOperation = NSBlockOperation {
//My very long and intesive processing
let nPoints = 100000000000
var nPointsInside = 0
for _ in 1...nPoints {
let (x, y) = (drand48() * 2 - 1, drand48() * 2 - 1)
if x * x + y * y <= 1 {
nPointsInside += 1
}
}
let _ = 4.0 * Double(nPointsInside) / Double(nPoints)
}
backgroundOperation.queuePriority = .Low
backgroundOperation.qualityOfService = .Background
processingQueue.addOperation(backgroundOperation)
}