iOS同步对象性能对比(iOS锁性能对比)

来源:互联网 发布:爱钱进可靠吗 知乎 编辑:程序博客网 时间:2024/06/05 17:13

http://lijianfei.sinaapp.com/?p=655&utm_source=tuicool&utm_medium=referral

在iOS开发中,支持多种同步方法,我们从耗时角度出发,评估各种同步对象的性能。

  1. @synchronized
  2. NSLock
  3. NSCondition
  4. NSConditionLock
  5. NSRecursiveLock
  6. pthread_mutex_t
  7. OSSpinLock
  8. dispatch_barrier_async

示例代码如下:

 

一.模拟器/iOS7/XCode6下性能对比

日志情况:

 

总结对比

syn_compared_simulate

二.iPad Mini2/iOS7/XCode6下性能对比

syn_compared_ipad_mini2

总结

  • 耗时方面:
    • OSSpinlock耗时最少;
    • pthread_mutex其次。
    • NSLock/NSCondition/NSRecursiveLock 耗时接近,220ms上下居中。
    • NSConditionLock最差,我们常用synchronized倒数第二。
    • dispatch_barrier_async也许,性能并不像我们想象中的那么好.推测与线程同步调度开销有关。单独block耗时在1ms以下基本上可以忽略不计的。
  • 在访问次数比较多的情况下,IMP访问耗时要比消息发送略小。 参看NSLockNSLock + IMP对比。
  • 为什么不直接使用IMP而使用直接声明函数指针的方式? XCode6下IMP不能指定参数,报错如下

error_overview

  • 如何解决呢?修改LLVM预处理设置即可。详情见XCode6下Too many arguments to function call, expected 0, have 2解决办法

原因分析

1.synchronized

 

2.NSConditionLock

 

3.OSSpinLock

 

4.pthread_mutex

 

结论:

  • 如果只是粗略的使用锁,不考虑性能问题可以使用synchronized。
  • 如果对效率有较高的要求,还是采用OSSpinlock比较好。
  • 因为Pthread的锁在也是用 OSSpinlock 实现的。OSSpinlock 的实现过程中,并没有进入系统kernel,使用OSSpinlock可以节省系统调用和上下文切换。

 

参考文章:

http://ksnowlv.github.io/blog/2014/09/07/ios-tong-bu-suo-xing-neng-dui-bi/

http://www.coneboy.com/?p=1433


0 0
原创粉丝点击