MD5算法性能测试
(一) 实验目的
本次实验的主要目的是测试中大量使用MD5运算是否对网站或者系统带来性能方面的影响。
(二) 实验场景
根据实验目的,设计了如下三个场景:
1. 单线程下 运行5000次 计算平均时间(分别运算100K;200K;300k;字符)
2. 20个线程 共运行5000次 计算平均时间(分别运算100K;200K;300k;字符)
3. 20个线程 持续运算3小时压力测试 计算平均时间和cup占用情况(运算300k字符)
(三) 测试环境
CPU | Intel(R) Core(TM)2 Duo CPU E7500 2.93G |
内存 | 3.0G |
本人使用PC(非专用服务器) |
(四) 主要测试程序
1. 单线程主要测试程序:
Stopwatch sw = new Stopwatch();
ArrayList arry = new ArrayList();
for (int i = 0; i < 5000; i++)
{
byte[] strByte = Encoding.UTF8.GetBytes(strValue);
sw.Start();
MD5Hash(strByte);
sw.Stop();
arry.Add(sw.Elapsed.TotalMilliseconds);
sw.Reset();
}
//md5算法
private void MD5Hash(byte[] bytes)
{
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
provider.ComputeHash(bytes);
}
2. 多线程主要测试程序
int MaxThread = 20; decimal totle = 0;
Console.WriteLine("执行开始时间:{0}",DateTime.Now);
Stopwatch sw = new Stopwatch();
sw.Start();
ManualResetEvent[] manualEvents =new ManualResetEvent[MaxThread];
for (int i = 0; i < MaxThread;i++)
{
manualEvents[i] = new ManualResetEvent(false);
MD5info objMD5info = new MD5info(i, manualEvents[i]);
MD5Test objMd5test = new MD5Test();
objMd5test.Size = 300;
ThreadPool.QueueUserWorkItem(new WaitCallback(objMd5test.MD5output),objMD5info);
}
WaitHandle.WaitAll(manualEvents);
(五) 测试结果:
1. 5000次测试结果
运算字符串大小 | 执行次数 | 响应时间(毫秒) | 20线程 响应时间 |
100K | 5000 | 0.14ms | 0.153ms(20个线程) |
200K | 5000 | 0.32ms | 0.31ms(20个线程) |
300K | 5000 | 0.54ms | 0.471ms(20个线程) |
2. 3小时持续运算压力测试结果
具体场景设计如下:
每个线程执行次数100000次
执行线程数20个
每次执行间隔时间 0.1S
每次运算字节数 相当于300K大小的网页
开始时间: 15:07:58 结束时间16:39:46其中程序运行总时长11053.451秒约合 3小时4分
算法平均运算时间 0.73545毫秒
具体执行结果如下
根据perfmon跟踪的cpu变化 如下图
根据上图可以看出在持续3小时的算法测试中 cup平均使用率只有5.487%,需要指出的是这个cpu的使用率是整个实验程序的和windows本身其它内部程序的耗损之和,真正MD5算法只占其中的一部分,在上述实验场景的测试中我们发现cpu的使用率长期稳定在8%,说明算法可能占据了一部分cpu,但是这个占用率还是比较小的。
(六) 实验总结:
综上所述 在单独的算法测试中MD5耗时均小于1毫秒,时间很短,在长达3小时的多线程压力测试情况下,算法的平均算法用时0.74ms,cpu占用率大部分维持在低位状态8%,但是实际的应用场景运算频率要远远小于上述实验场景,加之我们只是采用普通的pc机进行的测试,所以在实际应用中MD5算法对服务器cpu的压力几乎可以忽略掉。