2012-02-04 23 views
0

是否值得花时间编写代码来重用C语言中的线程,还是便宜的创建和销毁?值得重用的C线程?

我渲染一些CPU只有3D图形,它是非常慢(看起来像约5帧)。我尝试使用线程来解决这个问题。使用4个线程,每个线程渲染一个屏幕条,似乎将我的帧速率提升到非常合理和平滑的状态。我仍然担心当我的图形更复杂时会发生什么。我会重新使用我的线程,而不是在每一帧创建和销毁它们,从而获得明显的速度提升吗?

编辑:我正在使用的操作系统是Windows。

+0

每个_frame_?我很确定这将会很昂贵。 – 2012-02-04 22:17:56

+0

投票不具建设性。重用你的线程(通过线程池)将节省开销,但是否真的需要这个是主观的;如果你遇到与线程创建相关的性能问题,那么是的。 – 2012-02-04 22:18:05

+0

绝对重用一个线程池的线程,说 – 2012-02-04 22:24:09

回答

3

由于使用1个线程可以获得大约5 fps,推测可以使用4个线程,您可以达到20 fps左右的某个位置?那么,如果你不保留它们,你会每秒创建并销毁80多个线程?线程相当轻量级,但我认为你会开始注意到那么多开销。

+0

每秒80没有什么,除非Windows吸收超过我意识到。每帧80帧可能代价很高,但在Linux上,线程创建成本大约在20微秒左右。没有我想要的那么低,但在每秒80次,即1600微秒,即1.6毫秒或0.16%的开销。 – 2012-02-04 22:40:02

+0

好的,我会尝试重用我的线程,如果它太慢,谢谢。线程的速度似乎存在一些争议。 – 2012-02-04 22:51:42

+0

我有兴趣从Windows体验中听到ppl的体验,在Windows上创建线程有多慢。 – 2012-02-05 00:04:15

1

你会消除相当多的开销和延迟,是的。 TBH,我不明白为什么这么多开发人员会不断创建和销毁主题 - 这是效率低下,困难并容易发生泄漏和其他灾难的原因。

+0

我不同意。根据需要创建和销毁线程可以实现干净而简单的资源管理。合并和重用它们会迫使您对线程和资源生命周期进行更复杂的管理。对于许多任务来说,性能是一个不会经常创建和销毁线程的有力理由,但是在体面的操作系统中,性能问题只会在每秒达到数万个线程时才会出现。请记住,指示一个条件变量很容易花费10-20%的时间来启动一个新的线程。 – 2012-02-04 22:44:05

+0

那么,同意不同意这个问题会容易得多,而不是开始一个线程设计的圣战。 – 2012-02-04 23:16:08

+0

不需要圣战。 :-)我同意这两种方法都有优点,但我认为“常识”有点过时并且朝一个方向发展,而简单的论点却与此背道而驰。仍然有两个地方。我倾向于倾向于让线程的生命周期与其任务/数据域相一致,该任务/数据域位于池之间(将新任务/数据重新分配给现有线程)以及不断创建/销毁。 – 2012-02-05 00:03:49