为什么我的C#(Mono)应用程序使用低CPU?

时间:2013-12-06 21:41:39

标签: c# mono cpu-usage

我有一个(白帽)密码破解工具,它不断递增密码字符串,然后对其进行散列以将其与提供的散列(我想要破解)进行比较。但是,该程序仅使用14%的CPU。

应用程序有两个线程,其中只有一个应该是资源密集型的。我的机器有4个带有超线程的内核(8个虚拟内核)。甚至一个核心的CPU使用率也不超过25%。根据资源监测,这项工作似乎在四处传播(每个核心的平均值约为12%)。

有没有办法让它使用更多的CPU并希望运行得更快或者它不能以这种方式工作?

3 个答案:

答案 0 :(得分:3)

最简单的方法显然是多线程。由于大多数现代CPU都有多个内核,因此如果使用单个线程,则一次只能使用一个内核。

http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx

以上是多线程教程。

至于策略,因为你似乎是强制密码,你可以从不同的初始字符串开始发生多个'字符串递增'。

答案 1 :(得分:2)

8 * 12 = 96(或8 x 12.5 = 100)。由于您应用程序的内容是单线程的,因此它只能同时在单个核心上运行。它按照正常的流程调度规则从核心跳到核心。由于它使用每个核心,因此它在该核心上持续使用100%的核心。但它只在每个核心的1/8时间。

答案 2 :(得分:1)

您正在寻找的是所谓的MultiThreading,当您的应用程序在单个线程上运行时,如果您希望它运行更多,您需要学习如何将相关任务拆分为相等的块。

您将面临的另一个问题是线程安全问题,因为您的线程将共享相同的资源。为了避免随之而来的问题,您需要锁定您尝试访问的数据,这将阻止其他线程访问资源,直到线程完成为止。

如何使用线程

var thread = new Thread(()=> RunMethod());
thread.Start();

如何锁定数据:

private static readonly Object lock = new Object();
private void RunMethod()
{
    Lock(lock)
    {
        // Access or modify shared resource
    }
}