代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

我的代码需要利用多线程的信号是什么?

  •  2
  • GurdeepS  · 技术社区  · 14 年前

    我使用的是第三方api,从使用的时间/资源(图像识别等)来看,它执行我认为代价高昂的操作。测试中的代码应该使用线程来提高性能,这是什么信号?

    我有一个profiler,将分析我编写的依赖于这个api的代码。

    谢谢

    2 回复  |  直到 14 年前
        1
  •  1
  •   JustJeff    14 年前

    如果有两个不同的事件序列彼此不依赖,那么考虑一下。如果您必须编写一组逻辑来确保两个操作不会相互妨碍,那么通过使这两段代码更清晰来获得回报。

    另一方面,如果您发现,在尝试多线程时,您必须添加大量代码来在线程之间传递结果,因为一个(或两个)不能在没有另一个的某些信息的情况下继续,这是一个很好的迹象,表明您正试图使线程 不要 有道理。

    一种情况是,多线程是有意义的,即使您必须添加通信来完成它,也就是当您有一个任务需要保持可供输入,而另一个任务需要进行大量计算时。一个线程可以从某个地方轮询输入,在没有可用输入时阻塞,以便在输入可用时及时响应,并将作业馈送到另一个“工作线程”,以便处理始终继续,而不仅仅是在有输入时。

    另一件需要考虑的事情是,即使当一个作业“令人尴尬地并行”(即,在并行部分之间几乎不需要或根本不需要通信)时,也存在多线程可能不值得的情况。如果你的CPU可以将不同的线程分配给不同的内核,多线程将通过允许多个内核同时咀嚼工作来提高速度。但是在一个单核处理器上,甚至是一个拥有不幸操作系统的多核处理器上,拥有多个线程不会加快速度,因为单核处理器仍然需要完成所有的工作。

        2
  •  1
  •   Brian    14 年前

    图像处理通常受CPU的限制。但是,如果您的图像处理api已经被设计为利用多个cpu,那么多线程可能对您没有帮助。我通常考虑的快速确定多线程是否有帮助的策略是编写一个简单的程序,反复执行相关的处理。然后,我将在一组数据上运行它,然后同时运行进程的两个实例,每个实例运行一半的数据。没有必要确保这样一个测试的数据是均衡的;如果一个进程用完了,它只会为剩下的任何东西运行一个实例。计时通过挂钟时间完成。我的意思是字面意思;选择一个足够大的数据集,运行至少需要一分钟,但理想情况下需要5分钟或更长时间)。

    如果同时运行两个副本可以显著提高吞吐量,那么多线程可能是一个好主意。显然,这种策略只在某些情况下是可行的,在某些情况下,多线程可能涉及以这种技巧无法模仿的方式利用共享输出。但是,这是一个非常容易运行的测试,而且很少需要编写太多(如果有的话)代码。