性能杀手!老生常谈。。。

写了一个内存管理器,主要用来做缓存,于是就测试一下性能,顺便说说性能杀手都在哪里。预警:老生常谈,大侠可以右上角点关闭了。

1。这个内存管理器就是最简单的那种,固定长度的(比如:固定256字节)。没啥技术含量,然后就是加锁给线程调度,因为是固定长度,所以开始就分配一大块内存(2M)进行分片并加入数组实现的队列。性能吗,水平太菜就不要对我要求太高了,基本内容摆在哪儿(数组队列,AtomLock),理论上也不会差到茄子地里。

2。测试机是个烂笔记本:i5-2520M,大约是同时代的台式机的一半性能,总之,很烂。

3。好了,切入正题,首先TestCase(单线程)直接进行100万次出队入队,耗时200ms,换算过来大约是500万/s(5000/ms)的锁操作,因为里面还有一些简单的内存分配策略,所以,这个速度基本上是能够接受的。

4。进一步,将取出来的内存进行随机填充(Fill)操作,比如都随机填充成可识别字符(Char(33)~Char(126),这是一个最简单也是最好用的测试手段,有没有错误都可以一眼看到的,当然更严格的业务测试就不要用这种方法了),此时的性能就急剧下降了,100万次(单线程)的操作竟然耗时3994ms,换算过来大约是25万/s(250/ms)。

好了,可以上结论了:仅仅只对内存做了一个Fill操作,啥事都没干,性能就差了20倍左右!!!!注意:因为获取内存指针是加锁的,所以填充(Fill)就没有在锁中操作,理论上也是线程安全的,如果在锁中操作,则耗时达到7440ms,更慢,性能会再下降一倍。

再思考一下,内存速度都渣成这样,你还能指望外设和网络有更NB的表现吗?不要把意思理解错了,我的意思是内存性能要比外设和网络至少要好一到两个数量级,要是非得用核心节点和超算的光纤网来抬杠就没啥意思了,当然,你得明白,就算在超算上,外设和网络的速度也是比不上内存速度的。

对于目前的应用来说,计算性很强的部分一般都交给GPU去做了,一般的日常应用瓶颈还是在内存、外设和网络上,非要说CPU性能不够用,可能性不大。当然,具体情况要具体分析,不要死搬教条就对了。

最后说说“重复造车轮子”的事情,肯定很多人会以一种嗤之以鼻的态度来鄙视这种“愚蠢”行为,这个我得承认,自己造的车轮子肯定没有别人的好。这是毫无疑问的。但是,如果我们换个角度换个思维方式,也许就是两种情况。简单絮叨一下吧:

1。学会了造车轮子!学会新知识又不会把人压死,又不是多背了一根稻草,所以,不会成为那只死骆驼的。

2。只有自己造车轮子才会想起参考别人的代码,去了解别人的思路,才会发现原来redis,memcache,nosql是这样玩的,更加拓宽自己的视野,这种事情何乐而不为呢?

扫描二维码关注公众号,回复: 839373 查看本文章

3。拓宽思路:别人的车轮子固然好,但是要遵守别人的规则,比如:进程->网络->Server->网络->返回结果。中间明显的网络消耗在哪儿摆着,为啥不直接集成在自己进程中来省掉网络传输呢?当然你得有类似的业务需求才能这样干。同样还面临着其它一堆乱七八糟的问题需要处理。这个意思就是说鞋子合不合脚,只有自己知道,也只有适合自己的才是最好的。再说一点,有关这个内容的思路拓展,其实还有很多很多可以絮叨的,这里就打住吧。

4。最后引用经典的那句台词作为结束吧:走自己的路,让别人说去吧!

BTW:本来想说有些托儿在这种事情中扮演了极不光彩的角色,但是觉得打击面太大,还是少说比较好。最重要的是在采取“拿来主义”时一定要带上自己的智商让自己的智商在线才能做出适合自己的选择!与各位共勉。

猜你喜欢

转载自blog.csdn.net/yayongm/article/details/79684475