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逻辑处理器再跑,要是都跑的话,速度不就翻了很多倍? 展开
发现校验小文件没问题,大文件的时候速度比较慢。
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逻辑处理器再跑,要是都跑的话,速度不就翻了很多倍? 展开
2个回答
展开全部
应该是你算法需要优化,而不是提高线程的优先级。
还有,耗时的算法应该封装成C/C++库,然后C#来包装调用C/C++库函数,这样性能能提高很多,当然了,PInvote调用也是比较耗时的,所以建议不要频繁的调用PInvote,如果是For或者Foreach循环,应该封装到C/C++里。
还有,耗时的算法应该封装成C/C++库,然后C#来包装调用C/C++库函数,这样性能能提高很多,当然了,PInvote调用也是比较耗时的,所以建议不要频繁的调用PInvote,如果是For或者Foreach循环,应该封装到C/C++里。
更多追问追答
追问
在一些算法上,C和C#就体现出来执行效率的问题了?
追答
必须的啊!
C++是编译执行的,就是编译成二进制机器码,CPU直接执行
C#是解释执行的,编译完了还只是一种中间语言,CPU执行前还需要根据CPU特性翻译一遍才执行。
展开全部
/// <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秒钟。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询