- 今天是2012年5月28日,我的职业生涯也满一年了。在工作闲暇之余,有一种想用文字记录下我的这些经历,以激励以后的我能以更积极的态度,更强大的心态来面对一切。
- 总的来说,这个工作还算比较满意。虽然公司不大,刚成立,但是在这里我能学到很多东西。老板和上司也比较器重我,同事关系较融洽。
- 在这一年里,我接触到以下一个方面的技术以及工作经验:
- 1.较基础的理论知识:了解了这个行业的发展历史,前景,现状以及相关的专业知识。
- 2.学习并实践了WCF技术:现在基本可以得心应手的使用WCF了。当然这中间经历了很多困惑以及艰难,但是都在同事的帮助以及自己的努力之下一一克服了。在学习的过程中,我发现,要快速上手一门技术并没有一开始你想象的那么难。
- 3.了解了MVP,支持MVP的SCSF框架,Linq使用方法与技巧。这个自己没有查看过什么资料,完全是在leader的指导之下一步一步的领悟的。最后也只是知道一些皮毛,因为没有时间学习。
- 4.了解并学习了一个专业绘图控件:学会了使用方法,使用技巧。虽然不能面面俱到,但至少在下次使用时会事半功倍。
- 5.全面了解多线程的机制,原理以及使用时的注意事项。现在水平还一般,只能说略知一二。
- 6.纠正了自己写代码的一些不规范的习惯。
- 7.弄明白了什么样的代码是好代码。弄明白了以前模糊不清的概念。会用与用的恰到好处还有很长的一段路要走。
- 8.最重要的一点:明白了自己和别人的差距在那里。进公司之前,一直觉得自己很牛,但是在发现自己犯下一次次的低级错误后,我发现了自己的不足:
- a.基础知识不够扎实:连简单的对象,事件,接口,继承之间的关系都没有搞透彻,我的基础只是较片面;
- b.遇到问题不能客观的看待:而是以“猜测”的心理去解读。有一种“这个事情已超出我的能力范围,我肯定搞不定”的心理在作怪。其实并没有我想象的那么难,只是自己走不出自己给自己设下的“圈套”。
- c.不主动接受新技术:遇到问题知道解决方案了,但是往往因为需要学习新东西而放弃机会,进而用自己已经精通的方法去解决。这样做会让自己错过很多接触新知识,开拓视野的机会,以后要改正。
- d.写代码急功近利:在没有看清楚全貌的时候就基于下手,最后逻辑越来越复杂,连自己都搞不清楚。这个一直依赖都是我的死穴,以后一定要改正。
- e.思维逻辑过于跳跃,对复杂逻辑缺乏耐心:不想深入理解业务逻辑,缺乏分析不同系统直接逻辑关系的意识以及能力。
- f.没有将上司布置的口头任务放在心上:上周或者昨天,上司在你不经意间说的一句话,很有可能就是你的新任务,虽然没有正式通知你该怎么做,但是你自己要即使领会其中含义。
- g.言多必失,要三思而后行:不要给任何事物下结论,把下结论这事留给领导,我用数据解释现象即可。说话不要带:“可能”,“大概”,“也许”,“说不定”,“肯定”,“肯定不可能”这样的表达个人主观判断的词。
- h.不能越界干活:该自己做的不要问别人,不该自己做的坚决不做,不知道是不是该自己做的问领导。
- i.用面向对象的思想写代码:写代码除了要注意规范外,还要注意用面向对象的思维设计。不能单单从业务逻辑流程来设计代码架构。这个虽然是常识,但是在为了赶进度,往往忽略代码的可扩展性,而写出自己都觉得垃圾的代码。
- 展望未来:
- 1.努力改正自己的不足,时时反省自己,缩小差距;
- 2.养成学习的好习惯,多多接触新的概念与思想,多与人交流。学习到好的思想与解决方案后要融会贯通,为我所用;
- 3.多看书,不要将时间浪费在无聊的事情上;
一、场景:
需要将有一定格式的File里的内容读取到已经定义的类中,譬如一个二进制文件里的内容读取到一个新的DataStructure里面。
1. File不是很大,一次将所有内容Load到内存中,不会占用太多Memory;
2. 二进制文件无法直接反序列化成一个Object,需要一个映射才能完成转换.
二、为什么不用FileStream:
首先,我们来看一下FileStream的代码以及原理:
FileStream fs = new FileStream(binaryFilePath, FileMode.Open, FileAccess.Read);
Encoding enc = Encoding.ASCII;
using (BinaryReader br = new BinaryReader(fs,enc))
{
//
}
BinaryReader 提供了ReadInt16,ReadChar,ReadDouble,……但是每次Position.Seek都会去定位流的指针,所以会耗费一些时间。
但是如果我们一次性的将所有内容都独到内存(Memory)中,然后操作Memory是不是更快呢?
三、MemoryStream实现方法
FileStream fs = new FileStream(binaryFilePath, FileMode.Open, FileAccess.Read);
//Read all bytes into an array from the specified file.
int nBytes = (int)fs.Length;//计算流的长度
byte[] byteArray = new byte[nBytes];//初始化用于MemoryStream的Buffer
int nBytesRead = fs.Read(byteArray, 0, nBytes);//将File里的内容一次性的全部读到byteArray中去
using (MemoryStream br = new MemoryStream(byteArray))//初始化MemoryStream,并将Buffer指向FileStream的读取结果数组
{
/your code
}
四、性能分析
分别用以上两种方法Load File:1,2,3,4,5,6,将其Load的时间记录下来:
| File | File Size(Mb) | FileStream(ms) | MemoryStream(ms) | Performance Enhancement |
| 1 | 0.5 | 921 | 392 | 2.35 |
| 2 | 7.1 | 4454 | 1466 | 3.04 |
| 3 | 14 | 7848 | 3366 | 2.33 |
| 4 | 28 | 16025 | 6242 | 2.57 |
| 5 | 44 | 21196 | 9268 | 2.26 |
| 6 | 73 | 27533 | 14503 | 1.90 |

可以看出:应用了MemoryStream性能提高了2-3倍。

可以看出:随着File内容的增加,性能提高的就越来越缓慢,因为他占用了更多的内存空间,可以说是:“以空间换时间”。