首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

【散300分】一个简略的压力测试引擎代码

2012-12-17 
【散300分】一个简单的压力测试引擎代码我在这里还是简单描述一个压力测试引擎代码(而不是全部具体实现),同

【散300分】一个简单的压力测试引擎代码
我在这里还是简单描述一个压力测试引擎代码(而不是全部具体实现),同时用来演示 Parallel Extensions to the .NET Framework 这个东东的作用。

所谓压力测试,表面上看不过是运行一个或者几个测试用例一定次数(例如100次、1000次、5000次),然后统计不同压力下平均响应时间,并从时间变化的曲线拐点上来分析。

假设测试用例的原型定义是这样:

        private class TestCaseType
        {
            public TestCaseDelegate proc;  //测试程序
            public string desc;            //测试程序的标题(摘要说明)
        }

        private delegate void TestCaseDelegate();

可见测试用例就是一个没有参数并且没有返回值的方法。

接下来,假设你已经可以实现如下定义的一个获取测试用例的方法:
private static IEnumerable<TestCaseType> GetTestCases(this  Assembly[] assembly)
{
    。。。。
}

这个方法对于输入的一组 Asembly,可以遍历所有 class,反射其所有 Method,找出标记(Attribute)为测试用例的那些方法,并且返回为一组 TestCaseType。(这个过程与本文主旨无关,我省略了)

于是我要演示的压力测试的引擎代码就是:
        private static void StressTest(this  Assembly[] assembly, int 次数)
        {
            var tps = GetTestCases(assembly);
            if (tps.Count() == 0)
            {
                System.Console.WriteLine("******** 没有测试用例 ********");
                return;
            }

            var map = tps.AsParallel().SelectMany(tp => Clone(tp, 次数)).Select(tp => Test(tp));
            var reduce = from t in map
                         group t by t.proc into g
                         orderby g.Average(p => p.mi) descending
                         select new { proc = g.Key, desc = g.First().desc, mi = (long)g.Average(p => p.mi) };
            int testCnd = 0;
            reduce.ForEach(r => { System.Console.WriteLine("{0} 平均{1}毫秒\t{2}", ++testCnd, r.mi, r.desc.Description); });
        }

        //将测试用例重复多次
        private static IEnumerable<TestCaseType> Clone(TestCaseType t, int 倍数)
        {
            var c = new List<TestCaseType>();


            for (var i = 0; i < 倍数; i++)
                c.Add(new TestCaseType { desc = t.desc, proc = t.proc });
            return c;
        }

        //单独执行一个测试用例并记录耗时。如果可能,Test应该在一个Master机辅助下分布到不同的Worker机上执行。
        private static TestCaseTestType Test(TestCaseType p)
        {
            var wt = new Stopwatch();
            wt.Start();
            p.proc();
            wt.Stop();
            return new TestCaseTestType { proc = p.proc, desc = p.desc, mi = wt.ElapsedMilliseconds };
        }

        static public void ForEach<T>(this IEnumerable<T> array, Action<T> proc)
        {
            foreach (T obj in array)
                proc(obj);
        }



这里如果不写 AsParallel() 就是普通的顺序执行测试,而写上就可以利用多核多进程的能力并行执行了。

这个算法的过程是:找到相关的测试用例,然后重复执行的次数,并行执行,然后统计出每一个测试用例的平均执行时间,最后按照执行时间从高到低的顺序打印出来。

如果你的计算机有多核,或者如果Test方法分布到其它计算集群执行主机上,就可以大大提高性能。
[最优解释]
呵呵,写这个帖子终于让我想去修改一下这个代码了。

我看到方法Clone有点笨拙。我们可以使用c#支持的迭代器机制去重写,迭代器用在大型复杂的功能里会有更节省空间和时间:
        private static IEnumerable<TestCaseType> Clone(TestCaseType t, int 倍数)
        {
            for (var i = 0; i < 倍数; i++)
                yield return new TestCaseType { desc = t.desc, proc = t.proc };
        }

[其他解释]
mARK
[其他解释]
帮顶~谢谢楼主分享~
[其他解释]
呵呵,上面代码 r.desc.Description 写成 r.desc 就可以了。我的实际程序中 desc 属性稍微复杂一点点而不是string,所以才那样写。
[其他解释]
关注,帮顶,学习!
[其他解释]

[其他解释]
靠,作为sp1234资深粉丝+研究者,我的确来晚了。。。。
[其他解释]
学习
------其他解决方案--------------------


引用:
代码一次性写成,以后我就从来没有优化过。也用不着太多考虑优化!这就是Linq的好处。


各位,这句才是精华!
[其他解释]
学习。
[其他解释]
mark
[其他解释]
学习一下!!
[其他解释]
sp1234,那是要顶的,要学习的。
[其他解释]
PLinq是个好东西啊,现在就等2010发布了
[其他解释]
没怎么看懂这个引擎,原理是什么呢? 1234大侠能多给点注释吗
[其他解释]
学习
[其他解释]
谢谢,学习了
[其他解释]
Linq 的性能似乎不是很好。
[其他解释]
看不懂    学习    顶
[其他解释]
学习了,感谢LZ
[其他解释]
uppppppppp
[其他解释]
哈哈,学习
[其他解释]
学习下
[其他解释]
学习下!唉,做的大多都是小项目,很少用到压力测试(一个字---懒).还是要顶下!
[其他解释]
就可以利用多核多进程的能力并行执行了 -->  就可以利用多核多线程的能力并行执行了


代码一次性写成,以后我就从来没有优化过。也用不着太多考虑优化!这就是Linq的好处。
[其他解释]
学习啦~~~~
[其他解释]
收藏并学习
[其他解释]
得 学习LINQ
[其他解释]
顶,刚接触LINQ。
[其他解释]
好东西!谢谢分享,收藏!
[其他解释]
帮顶,接分
[其他解释]
帮顶,接分
[其他解释]
学习了
[其他解释]
顶  学习学习
[其他解释]
支持
[其他解释]
学习 mark 
[其他解释]
学习了~~~~
[其他解释]
up
[其他解释]
(混乱的ajax编程必是垂死前兆)
和你同感
[其他解释]
哎~!跟不上了,有时间看一下Linq
[其他解释]
哇,sp1234的。。。赶紧mark
------其他解决方案--------------------


Mark
[其他解释]
學習....lz好英偉...
[其他解释]
dfdf
[其他解释]
学习下,plinq方面不懂
[其他解释]
“压力测试”还没用上呢...原因很多...
先学习了

[其他解释]
支持
[其他解释]
jhj
[其他解释]
mark 
[其他解释]
学习学习
[其他解释]
学习了......
[其他解释]
学习学习啊,对压力测试不太了解
[其他解释]
学习
[其他解释]
接分再看
[其他解释]
帮顶!
[其他解释]
学习
[其他解释]
Dingredients
[其他解释]
顶   谢谢楼主分享
[其他解释]
该回复于2010-01-19 17:26:15被版主删除
[其他解释]
up
[其他解释]
学习+接分。
[其他解释]
该回复于2010-01-19 17:26:14被版主删除
[其他解释]
很不错的啊
[其他解释]
帮顶。。学习
[其他解释]
up
[其他解释]
穷人来接份啦!!学习了
[其他解释]
stury
[其他解释]
study
[其他解释]
强强
[其他解释]
标记学习
[其他解释]
xx
[其他解释]
好好看看
[其他解释]
该回复于2009-09-28 09:26:17被版主删除
[其他解释]
学习学习,接分接分
[其他解释]
楼主确实很高深啊,学习下!
[其他解释]
恩  學習學習了  
[其他解释]
学习
------其他解决方案--------------------


楼主牛人。
向牛人看齐。
[其他解释]
upup
[其他解释]
谢谢楼主,学习了!!
[其他解释]
接分 学习
[其他解释]
学习
[其他解释]
哇。
[其他解释]
学习
[其他解释]
用了LINQ有一阵子了,就是没发现其真谛啊~唉~
[其他解释]
帮顶~谢谢楼主分享~

[其他解释]
学习
[其他解释]
深不可测啊...很多没看懂,哈哈 楼主推荐下咋学习吧,越来越觉得自己弱了~
[其他解释]
学习
[其他解释]
sp1234的贴子都应该看看,呵呵。
[其他解释]
mark
[其他解释]
学习中加QQ234224122
[其他解释]
学习 下 顶起来
[其他解释]
ding
[其他解释]
mark

[其他解释]
该回复于2009-10-11 09:03:07被版主删除
[其他解释]
null
[其他解释]
null
[其他解释]
以前听说过压力测试,这次下来试试。
[其他解释]
学习!

热点排行