在牺牲性能为代价的前提下,使用同步能够确保代码的正确执行。在大多数情况下使用同步工具都会造成延迟。锁和原子操作通常都会涉及到使用内存屏障和内核级的同步来确保代码正确执行。当出现锁竞争的情况下,线程可能会被阻塞从而导致体验上的延迟卡顿。
下表列出了在没有争议的情况下互斥锁和原子操作的大致消耗,这些结果都是平均值。和线程创建事件类似,互斥采集时间会跟处理器负载情况,计算机速度,以及程序和系统存储器数量有关。
Item | 大致消耗 | Notes |
---|---|---|
互斥采集时间(Mutex acquisition time) | 0.2ms | 在确定情况下,锁的采集时间。如果锁被另外一个线程持有,那么这个时间会变得大一点。这些数据是在运行于mac OS X v10.5并基于intel 2GHz Core Duo处理器和 1GB RAM 的iMac上采集到平均值。 |
原子比较和交换(Atomic compare-and-swap) | 0.05ms | 在确定情况下的比较和交换时间。同样是处于同一种环境下测出的平均值。 |
当在设计并行任务时,总是要将正确执行放在首位,但同时也要考虑到性能因素。如果在多线程下的正确执行代码的时间和在单一线程上运行相同代码的时间差不多,那就没有必要使用多线程来改进代码设计了。
本人总结TIPS
- 互斥采集时间会跟处理器负载情况,计算机速度,以及程序和系统存储器数量有关;
- 锁和原子操作通常都会涉及到使用内存屏障和内核级的同步来确保代码正确执行;
如果锁在被其他线程占用的情况下,锁的采集时间会相应的增加;
当在设计并行任务时,总是要将正确执行放在首位;