C# 提高程序优先级,提高运算速度

用Winform做了一个文件校验工具,就是查MD5、SHA的。发现校验小文件没问题,大文件的时候速度比较慢。700M的东西,用网上的工具测试下来10s,我的却需要40s。... 用Winform做了一个文件校验工具,就是查MD5、SHA的。
发现校验小文件没问题,大文件的时候速度比较慢。
700M的东西,用网上的工具测试下来10s,我的却需要40s。。。。。。囧

于是查资料,修改程序优先级。

[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in ps)
{
if (p.ProcessName == "FileHashMd5.exe")
{
p.PriorityClass = System.Diagnostics.ProcessPriorityClass.RealTime; //High也没用
}
}
Application.Run(new Form1());
}

请问高手,这是什么情况?
怎么才更快一点嘞。

谢谢。
在运行的时候,只有一个cpu逻辑处理器再跑,要是都跑的话,速度不就翻了很多倍?
展开
 我来答
khlerc
推荐于2016-09-18 · TA获得超过420个赞
知道小有建树答主
回答量:485
采纳率:0%
帮助的人:274万
展开全部
应该是你算法需要优化,而不是提高线程的优先级。
还有,耗时的算法应该封装成C/C++库,然后C#来包装调用C/C++库函数,这样性能能提高很多,当然了,PInvote调用也是比较耗时的,所以建议不要频繁的调用PInvote,如果是For或者Foreach循环,应该封装到C/C++里。
更多追问追答
追问
在一些算法上,C和C#就体现出来执行效率的问题了?
追答
必须的啊!
C++是编译执行的,就是编译成二进制机器码,CPU直接执行
C#是解释执行的,编译完了还只是一种中间语言,CPU执行前还需要根据CPU特性翻译一遍才执行。
syht2000
高粉答主

2013-11-08 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部
/// <summary>
/// 对文件流进行MD5加密
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
/// <example></example>
public static string MD5Stream(string filePath)
{
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
 
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    md5.ComputeHash(fs);
    fs.Close();
 
    byte[] b = md5.Hash;
    md5.Clear();
 
    StringBuilder sb = new StringBuilder(32);
    for (int i = 0; i < b.Length; i++)
    {
        sb.Append(b[i].ToString("X2"));
    }
 
    Console.WriteLine(sb.ToString());
    Console.ReadLine();
 
    return sb.ToString();
}
 
/// <summary>
/// 对文件进行MD5加密
/// </summary>
/// <param name="filePath"></param>
public static void MD5File(string filePath)
{
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
    int bufferSize = 1048576; // 缓冲区大小,1MB
    byte[] buff = new byte[bufferSize];
 
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    md5.Initialize();
 
    long offset = 0;
    while (offset < fs.Length)
    {
        long readSize = bufferSize;
        if (offset + readSize > fs.Length)
        {
            readSize = fs.Length - offset;
        }
 
        fs.Read(buff, 0, Convert.ToInt32(readSize)); // 读取一段数据到缓冲区
 
        if (offset + readSize < fs.Length) // 不是最后一块
        {
            md5.TransformBlock(buff, 0, Convert.ToInt32(readSize), buff, 0);
        }
        else // 最后一块
        {
            md5.TransformFinalBlock(buff, 0, Convert.ToInt32(readSize));
        }
 
        offset += bufferSize;
    }
 
    fs.Close();
    byte[] result = md5.Hash;
    md5.Clear();
 
    StringBuilder sb = new StringBuilder(32);
    for (int i = 0; i < result.Length; i++)
    {
        sb.Append(result[i].ToString("X2"));
    }
 
    Console.WriteLine(sb.ToString());
    Console.ReadLine();
}
追问
复制粘贴?!
追答
就是你认为低效的在效率方面不如C的C#,复制粘贴来的代码计算一个652M的文件的md5,一共用了8秒钟。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式