考虑我有一个在主线程中执行某些操作的单线程代码,它大约需要 10-20 毫秒。我想利用我的处理器的两个内核并将任务拆分给位于不同内核的两个线程。从技术上讲,我可能应该恢复两个睡眠线程并让自己入睡,直到它们完成并再次入睡。如果任务足够长可以执行,那就没什么可怕的了。但是对于 10-20 毫秒,我怀疑使用众所周知的同步技术会花费我大量的时间。如果我太怀疑并且 Windows/CPU 可以很好地使所有睡眠/唤醒请求有效,那么拆分仍然有意义的最小时间是多少,1 毫秒、10 毫秒、100 毫秒?
问问题
609 次
3 回答
4
使用现有线程池(现有休眠线程)的多线程可以加快 10-20ms 的操作。
唤醒线程并加入它们的具体同步调用是微不足道的,远小于 1ms。
要注意的一件事是参考的位置。如果在多个线程上运行的代码访问相同的内存,那么 CPU 将不得不同步内存访问,这可能会降低实际的性能提升。
同样,如果线程正在使用公共资源并需要锁定或其他线程同步,等待这些锁定会降低性能。
如果这些线程中有任何 I/O,那么将其拆分为线程将有助于最大程度地加快速度。
于 2012-08-30T12:45:16.117 回答
2
除非这个短任务被调用很多次(即在一个循环中),否则没有意义,因为即使在考虑任何任务切换/线程启动/同步之前,您最多也可以为自己节省 10 毫秒的处理时间......
于 2012-08-30T12:45:05.157 回答
1
如果您有许多任务并且您的工作线程不断地从公共队列中获取任务(例如在 ExecutorService 中),则任务的开销为 1..10 微秒。Fork/Join 设施更加有效。线程切换是最昂贵的操作,因此与其恢复 2 个休眠线程并让主线程等待,不如在主线程上运行一个任务,在工作线程上只运行一个任务。
于 2012-08-31T09:42:53.663 回答