我写了一个构建巨大搜索树的程序。因为我的树太大了,我预计我的程序将使用超过40%的cpu。而不是这个,我的程序使用不超过10%的cpu,即使它以高优先级运行。
如果线程在并行运行时会使用更多cpu,那么请让我知道;我可以在线程中划分我的程序,我需要真正减少搜索时间。
谢谢!
答案 0 :(得分:2)
而不是这个我的程序使用不超过10%的cpu
你有多少个处理器,你的操作系统如何测量10%,即如果你有10个处理器并且100%使用其中1个,那么某些操作系统会显示10%的使用率。
但是,如果你没有100%使用处理器,你需要找出原因。也许它以某种方式IO /网络绑定,你的IO以低效的方式。你还提到它“巨大”,那是什么意思?如果你真的意味着巨大,并且你耗尽了机器的所有内存并且你开始交换,性能就会消耗殆尽,你需要找到更高效的算法/内存使用或得到更多的公羊。
我可以在线程中划分我的程序
如果你的1个线程没有完全利用CPU,你可能无法从使用线程中获得任何东西。
答案 1 :(得分:1)
如果您有某种方法可以并行化构建搜索树的任务,那么使用线程将是一个可行的解决方案。这实际上取决于你正在建造什么样的树。如果您正在构建一些二进制搜索树的风格,那么它可能是可能的,但您必须小心确保在插入节点时最终没有任何数据争用。这可能需要每个线程在其访问的每个节点上获取锁定。如果您计划使用某种平衡树(AVL,红色/黑色,展开,AA等),这可能不会很好,因为旋转很容易干扰其他线程。
一种选择可能是拆分工作。有平衡二叉搜索树的实现支持快速合并(例如,红色/黑色树的某些变体可以在O(lg n)时间内合并),这意味着您可以尝试将数据分成组,构建一个从每个组中平衡二进制搜索树,然后将它们全部合并到一个平衡树中。这将利用并行性。
答案 2 :(得分:1)
可能你没有一个拥有10个内核的CPU,所以你的程序没有使用它可以使用的所有CPU,而你有一个不同的问题,比如I / O访问或类似的东西。
在这种情况下,使用更多线程不是解决方案。
树搜索可以很容易地在线程上划分(例如,通过不同的线程在子节点中搜索),但是由于您没有使用所有主线程容量,因此使用更多线程无法获得更好的性能。
CPU不是您的程序限制器
答案 3 :(得分:1)
您可以查看Task Parallel Library,将您的工作分成几个可以同时运行的小任务。
答案 4 :(得分:0)
运行多线程并不意味着更多地使用CPU,请查看parallel programming in .Net framework。