我正在研究一个需要执行一些光学字符识别的多线程应用程序。该应用程序的要求是它必须真正,非常快地工作。
有一段时间,我必须同时阅读6个不同的单词。所以我正在做的是,开始6个线程,一个专门用于阅读每个单词的线程。
但是,我想知道我是否应该更进一步,并为一个单词中的每个字符启动一个线程。例如,如果我有6个单词,每个单词大约有5-6个字符,这意味着30-36个线程(对于更长的单词,可能最多50-70个线程)。
要处理每个单独的字符,它似乎需要10-30毫秒,每个字总共需要200-300毫秒。 (我需要将它降低到每个单词100毫秒或更少)。
哪种策略实际上会给我带来更好的表现?每个单词一个主题,或每个字符一个主题?
答案 0 :(得分:5)
哪种策略实际上会给我带来更好的表现?每个单词一个主题,或每个字符一个主题?
答案很大程度上取决于您的硬件架构和实际处理过程。您的处理是完全 CPU绑定还是有任何日志记录或其他IO?回答这个问题的最好方法是通过多次试验来尝试各种不同的线程设置,以查看哪个更好。为了获得最准确的结果,您的测试运行时间应该超过几秒钟,以排除JIT和其他Java初始化。
结合其他想法:
正如@Sotirios和其他人所提到的那样,由于上下文切换开销,在问题上抛出更多线程实际上可能会让它运行得更慢。
您应该使用ExecutorService
线程池,这样您每次都不会分叉和收割线程。线程启动/关闭并不是一个无关紧要的过程。