如何让我的程序运行得更快:是否使用线程解决方案?

问题描述:

我写了一个构建巨大搜索树的程序。由于我的树太庞大,我预计我的程序将使用超过40%的cpu。而不是这个我的程序使用不超过10%的CPU,即使它运行在高优先级。如何让我的程序运行得更快:是否使用线程解决方案?

如果在运行并行线程会使用更多的CPU,让我请知道这事。我可以用线程划分我的程序,我真的需要缩短搜索时间。

谢谢!

+3

10%是多少内核? *看起来有点低 - 你确定你没有IO瓶颈吗? – 2011-01-22 22:53:31

+1

您的程序可能不是CPU绑定的,但带宽有限。 – CodesInChaos 2011-01-22 22:53:31

+0

而且你不应该增加正在使用很多CPU的线程/程序的优先级,而应该降低它以使系统响应。 – CodesInChaos 2011-01-22 22:54:27

代替本我的程序使用的CPU的不超过10%

多少处理器,你有,怎么是你的操作系统测量的10%,即一些OS将呈现10%的使用率,如果你有10个处理器,并使用其中的1个100%。

然而,万一你不利用处理器100%,你需要找出原因。也许它以某种方式IO /网络绑定,而且IO以低效率的方式绑定。你还提到它是“巨大的”,那是什么意思?如果你的意思是巨大的,并且你使用了机器的所有内存,并且你开始交换,性能就会下降,你需要找到一个更高效的算法/内存使用或者获得更多的内存。

我可以在线程分割我的程序

如果1个线程没有充分利用的CPU,你可能无法获得使用线程的任何东西。

使用线程将是一个可行的解决方案,如果你有并行构建搜索树的任务的一些方法。这真的取决于你正在建造什么样的树。如果你正在构建二叉搜索树的某种风格,它可能是可能的,但是你必须小心以确保当你插入节点时你不会结束任何数据竞赛。这可能会要求每个线程在其访问的每个节点上获取一个锁。如果你打算使用某种平衡树(AVL,红色/黑色,splay,AA等),这可能不太适合,因为旋转很容易干扰其他线程。

一个选项可能是分割工作。有支持快速合并的平衡二叉搜索树的实现(例如,红/黑树的某些变体可以在O(lg n)时间中合并),这意味着您可以尝试将数据分组为组,建立一个平衡二叉搜索树,然后将它们合并成一棵平衡树。这将利用并行性。

运行多线程并不意味着使用CPU较多,对parallel programming in .Net framework看看。

也许你没有与10个核心的CPU,让你的程序不使用所有的CPU,它可以和你有不同的问题,如I/O访问或类似的东西。

在这种情况下使用更多的线程不是解决方案。

树检索可以很容易的线程(在孩子们通过例如不同的线程搜索)进行划分,但由于您没有使用所有的主线程能力,你没有获得使用多个线程的性能更好。

的CPU是不是你的程序限制

你可以看看到Task Parallel Library分裂自己的作品为可同时运行多个较小的任务。