0

我正在开发一个需要执行一些光学字符识别的多线程应用程序。该应用程序的要求是它必须非常非常快地运行。

一次,我必须同时阅读 6 个不同的单词。所以我正在做的是,启动 6 个线程,一个线程专门用于读取每个单词。

但是,我想知道我是否应该更进一步,为一个单词中的每个字符启动一个线程。例如,如果我有 6 个单词并且每个单词大约有 5-6 个字符,这将意味着 30-36 个线程(对于较长的单词可能多达 50-70 个线程)。

要处理每个单独的字符,似乎需要 10-30 毫秒,每个单词总共需要 200-300 毫秒。(我需要将它降低到每个单词 100 毫秒或更短)。

哪种策略实际上会给我更好的表现?每个单词一个线程,还是每个字符一个线程?

4

1 回答 1

6

哪种策略实际上会给我更好的表现?每个单词一个线程,还是每个字符一个线程?

答案在很大程度上取决于您的硬件架构和正在完成的实际处理。您的处理是否完全受 CPU 限制,或者是否有任何日志记录或其他 IO?回答这个问题的最好方法是进行性能运行,尝试各种不同的线程设置,并进行多次试验,看看哪一个做得更好。为了获得最准确的结果,您的测试运行时间应该比几秒钟长得多,以排除 JIT 和其他 Java 初始化。

结合其他想法:

  • 正如@Sotirios 和其他人所提到的,由于上下文切换开销,只是在问题上投入更多线程实际上可能会使它运行得更慢。

  • 您应该使用ExecutorService线程池,这样您就不会每次都分叉和收获线程。线程启动/关闭不是一个无关紧要的过程。

于 2013-10-07T13:35:14.433 回答