南京袁永福 报表软件 C#.NET ASP.NET

南京PX(对二甲苯)项目,这是个问题。
三位一体的电子表单工具,同时支持WinForm表单,HTML表单和XSLT表单,表单模板在B/S和C/S下具有相同的用户体验. ---- C#.NET新型报表工具,支持WinForm和ASP.NET,WEB报表工具.
袁永福 江西九江人 2001年东南大学动力系毕业 电子邮箱:yyf9989@hotmail.com QQ群:41118220

开发速度和运行速度

    毛主席教导我们,对立统一是普遍的,任何事物都有两面性,软件开发也一样,其中就存在着开发速度和运行速度的对立统一。

    有一种观点,说计算机硬件发展很快,软件可以做的浮肿一些,计算机硬件的快速能弥补这种问题。一些人反对这种观点,都拿单片机上的程序来说事。

    我是赞同这种观点的,根据我个人的软件开发经验,对于大部分在普通的PC机上面的用于信息管理的应用软件而言,是可以依靠计算机硬件的高速度来弥补软件的浮肿缓慢,但一定要有所控制,记住一定要有所控制。

    首先看看我们使用的是什么样的硬件,硬件中最重要的就是CPU了,记得以前看过一本书,里面作者提到使用一个很弱的8086时代的CPU来扫描键盘,也就几MHZ吧,他测试了一下,人们以最疯狂的速度点击键盘,CPU在两次点击间的时间中已经把键盘扫描了36遍了。大家用的CPU都不错了把,大部分已过1G赫兹吧。1G赫兹什么概念,那就是能在一秒钟内执行数于亿条的机器指令,一行C#代码怎么说也不会编译生成超过1000个机器指令吧,一秒钟下来,几百万行C#代码执行完毕了。更何况现代的CPU采用什么超级流水线,预跳转等加速手段。反正CPU很快了,内存也快,硬盘也快,而且以后会更快。

    再来看看我们要写的程序,在这里我们讨论的程序是普通的运行在PC上面的应用信息管理系统。这种程序有一个特点就是它不需要实时性,或者要求比较低,允许花费一定的时间来等待操作的处理。因为计算机的速度越来越快,但人类的反应速度是不变的,对于100毫秒,计算机在这段时间执行了几千万条指令,而人类移动鼠标并按下按键时,好几个100毫秒过去了,更何况人类操作的时候还需要进行很缓慢的思考。因此100毫秒的意义对计算机和人是不一样的,我们应当利用这个不一样来帮助我们开发软件。

    比如一个软件功能运行耗时100毫秒,过去花了1月的时间开发完成。现在复杂了10倍,我们需要花费10月来完成。但计算机硬件速度缺快了100倍,软件的运行耗时却为10毫秒。对于操作员来讲,100毫秒和10毫秒是没有区别的,但对于开发人员来讲,1月和10个月是存在巨大的区别的。此时若有某种手段,使得开发时间大为降低,比如2个月,但软件速度慢了100倍,此时软件的运行耗时不变。对于操作员这个改变是不会察觉的,但对于开发人员确是很大的利好消息。

    因此作为软件开发人员,我们可以确定一个原则,在不严重降低软件性能的情况下,我们应当更关注于软件开发速度,在一定的范围内,我们应当使用软件运行速度换取软件开发速度。

    最后来看看我们如何开发程序,根据目前的水平,不论是现在还是相当长时间的未来中,软件是不能自动生成的,我们还是手工开发软件,我们需要使用人类自然而具有的思维能力来设计程序,编写程序,所有开发工具只是帮助我们记忆当前的工作状态和减少低层次开发工作。此时计算机软件不能从根本上帮助我们开发软件。人类的思维能力有其发展速度的极限,远远低于计算机硬件的发展速度。若开发策略没有什么变化,则软件复杂10倍,我们就要花10倍时间开发,即使有各种辅助工具,这个时间也不会降多少。

    我们的软件越来越复杂了,我们程序员越来越烦恼了。我们如何开发不断膨胀不断复杂的软件?为此我们提出了很多方法。

    首先是代码重用。最开始我们没有代码重用,所有的功能都是放在一个程序中实现,然后出现操作系统数据库等系统软件,把一些底层操作集成在操作系统中,提供API函数供调用,然后越来越多的软件提供API函数,然后就是COM对象,而现在就是JAVA包或.NET程序集。这些转变,导致程序越来越慢,接口效率越来越低下,框架越来越浮肿。

    然后是计算机语言的改变。从汇编到C语言,C++, VB,然后是JAVA和C#,,那一次不是导致软件的臃肿和效率的低下。

    所有的这一些,我们都好像是在退步,在堕落。于是我们干脆也就开始破坛子破摔了。

    以前写程序,斤斤计较,不浪费一位内存,不多一条指令,现在则是有些大手大脚。

    以前我们构造精巧的数据结构,现在我们就闭着眼睛枚举。

    以前我们只调用快速而直接的接口,比如中断,API函数等,现在我们鼓吹缓慢低效的WebService.

    我们真的堕落了吗,真的变懒了吗?不是的,我们变得更忙了,更会思考了。我们知道低层次的操作大部分情况下不应当考虑,在这个软件规模越来越大的时代下,我们再过多的纠缠于底层操作是不明智的,是不以时俱进的,我们更应当关注于应用,关注于业务逻辑。但底层操作却是不得不考虑的,还好人类的集体智慧很强大,有很多框架可以帮助我们隐藏掉底层操作,比如各种COM库,.NET框架,JAVA框架,各种ORM框架。所有的框架都让我们的程序臃肿不堪,但我还是强烈推荐使用,因为这些框架能大大加快我们的开发速度,而且现在的硬件能让臃肿的程序运行如飞。

    我们程序员很多是追求完美者,在当前时代的大背景下还在过于追求软件的运行效率。比如对于调用Win32API上,言必使用C++来调用,因为速度快效率高,所谓的原生态调用,不屑于其他语言来调用API。但C++开发应用程序是比较难的,比如ASP.NET,很少有人用C++作,但用VB.NET或C#开发的ASP.NET程序调用Win32API照样运行得欢。

    在这里就谈到技术的意义了,我的观点是技术也是对立统一体,在实现过程中应当像艺术,追求完美,但它的最终目标是很现实的,就是让开发技术或使用技术的人省时省力。开发软件是技术活,得考虑这两点间的平衡。不完美或太完美的技术都不会导致省时省力。一般的,越完美的技术开发速度越慢,但运行速度越快,这就像抛物线,我们应当追求其最高点,此处我们获得最多,这就需要开发速度和运行速度的平衡了。

    在这里我提到普通程序功能模块中的一个特例,那就是图形化用户界面,对于图形化用户界面的程序,必须考虑运行速度,因为用户界面是给人看的,而人眼睛的反应速度是很快很敏感的,比大脑的思考速度和手的操作速度要快得多,因此我们必须考虑绘制用户界面程序模块的运行速度,它必须快,否则会造成屏幕闪烁,严重影响用户体验。

    最后说一下面对复杂技术难题的策略,在大部分情况下,解决多个简单问题比解决单个复杂问题工作量要大,时间长,效率低,但这个过程是可以控制的,这是正道。一些数学家证明复杂命题时就是这么干的。我们当然也可以这样啦。

    于是对于编程中的复杂问题,我们可以优先考虑把它拆成多个简单的问题来解决,这有不少好处,首先是过程可以控制,对于单个的复杂问题,我们很难解决,有时得依靠灵感,开发一个应用系统过多的依赖灵感是不可靠的,有很大的风险。但对于简单的问题我们可以根据以往的经验来判断所需的时间,这使得软件开发过程可以预估计和控制。其次是难题拆开来解决利于团体合作,一个人只能解决一个问题,若碰到难题,则项目组只能指望解决这个难题的人,但拆开来后,项目组所有的人都能参与解决这个难题,这就发挥了团体合作的优势了。虽然有时难题拆开来解决过程麻烦,运行效率下降,但这是值得的。

    总之开发速度和运行速度是一个天生的矛盾,需要平衡,调和。但在目前的环境下,我们应当更偏重于开发速度,但万事都有个度,不能只考虑开发速度,不考虑运行速度,否则这个天平就会轰然倒塌了,这对谁都不好。

    注意,本文所说的软件仅限于普通的信息管理类软件,包括桌面程序和WEB程序,无实时性要求,运行在PC机上面。对于其他的比如实时系统,嵌入式系统,系统软件等软件,本文观点不可靠。

袁永福( http://www.xdesigner.cn ) 2006-11-3

posted on 2006-11-03 11:17 袁永福 阅读(1971) 评论(20)  编辑 收藏 网摘

评论

#1楼  2006-11-03 11:21 Jeffrey Zhao      

非常同意这些说法,不过也因此经常和一些“追求完美者”争论。:)   回复  引用  查看    

#2楼  2006-11-03 11:27 小陆      

客户花了宝贵的投资,购置先进的硬件条件,不是让开发人员糟蹋的。而是用来解决更复杂的业务问题的。
效率是任何时候都需要注意的。如果硬件真的要换,决不是为了开发人员换,而是因为用户的业务复杂到了一定程度、数据多到了一定程度,硬件必须要换。
开发速度和运行速度并不矛盾。提高运行速度需要减少程序运行的物理环节,而提高开发速度需要优化程序的逻辑结构。一个逻辑结构清晰的系统,在开发和维护的过程中,可以很方便的采取各种优化,使得系统的业务处理更加合理,提高运行效率。相反的,一个逻辑混乱的系统必然在物理结构上越来越繁杂,业务处理也只能搞很多弯弯绕的东西,效率也就越来越低了,开发维护难度也很大。   回复  引用  查看    

#3楼  2006-11-03 11:48 jillzhang      

性能和扩展一定要平衡,追求完美者也有道理,各人立场不同,没法子判断谁对谁错,也不要争论,有些问题只能靠时间来验证。   回复  引用  查看    

#4楼  2006-11-03 11:59 Hunts.C      

呵呵,哲学是最伟大的学问 :)   回复  引用  查看    

#5楼  2006-11-03 12:16 Dflying Chen      

@Hunts.C
同意,哲学是世界的根本道理   回复  引用  查看    

#6楼  2006-11-03 12:53 Cure      

用哲学的观点看技术,进行思考,呵呵   回复  引用  查看    

#7楼  2006-11-03 12:58 航天奇侠      


大型和慢不能相提并论。
小型软件也照样会慢。
所以慢,可以是两种情况:
a。逻辑有问题
b。程序没有最优化
b的情况就是大型系统地一般情况,用了累赘却安全正确的方法。

效率可以说是相对性的。我们知道cpu就是固定的速度,那么那种程序的效率不是一样的么?是一样的快,之所以给人不同的观感,在于本来就是不同的程序,实现了不同的功能。所以效率的问题,实质是功能的取舍的问题。要安全的流程,还是要最直接也最危险的流程,在乎系统是否需要。 当然这是在逻辑正确的情况下的取舍。同时这也只是讨论了安全方面,还有比如简易性,通用性等,程序并非只是实现功能为目的,更是为了一些其他目标而努力。



  回复  引用  查看    

#8楼  2006-11-03 13:11 Maxer [未注册用户]

其实不能那么说。效率还是很重要的。
因为影响程序性能的不只是某一行代码,而是整个系统的综合。
如果一个地方效率慢了一倍和其他地方结合起来整个系统不只是慢一倍,随着系统越来越大,越来越复杂。有可能是以2^N次方的速度下降。   回复  引用    

#9楼  2006-11-03 14:05 OOP      

现在说效率问题不得不说到多人协作的问题。
大型软件不能一个人来做,那势必要多个人协同工作,而人与人之间水平层次的不同会导致代码效率有很大差别,有时候看着自己精心编写的,自认为效率很高的代码和一大堆乱七八糟,不知所云的代码在一个项目中运行的时候,有种说不出来的感觉。。。
当然这里闲话了。   回复  引用  查看    

#10楼  2006-11-03 15:28 atempcode      

看看这篇吧:
The free lunch is over...
http://www.gotw.ca/publications/concurrency-ddj.htm   回复  引用  查看    

#11楼  2006-11-03 23:16 kchen      

呵呵,为了这个问题,我也思考过,受教了~~~   回复  引用  查看    

#12楼  2006-11-03 23:35 lazylu      

拜托~~~对立统一云云……是马克思抄黑格尔说D……况且……也算不上哲学。   回复  引用  查看    

#13楼  2006-11-04 09:35 fatbone [未注册用户]

如果只是慢几倍,应该没有问题。最关键的优化往往不是和具体的语言挂钩的,比如我以前读phd的时候做的数据挖掘的算法之间,运行速度可以相差成百上千倍。

再比如,如楼上所说hash换成枚举,这种速度差别可以到几千倍。   回复  引用    

#14楼  2007-04-28 19:00 testreport [未注册用户]

我尝试着用了您的报表设计器,不停在上面画各种元素,然后又全将其删除,观察了一下内存使用情况,发现每加一个报表,内存一直在涨.试问一下,如果用这个设计器查看在一天内查看一百个报表,最后会不会把计算机的内存耗尽?
  回复  引用    

#15楼  2007-04-28 19:01 testreport [未注册用户]

我们现在的.net的winform程序启动就占了 100M ,加上你的40M.一天下来没有一G内存能撑得住么?   回复  引用    

#16楼 [楼主] 2007-04-28 19:42 袁永福      

@testreport
.NET框架具有比较可靠的垃圾自动回收机制,经过我自己测试,不断的加载报表模板确实一直消耗内存,但超过一定值就会自动降低,一般的运行不会造成系统内存泄漏.若最小化设计器,则占用内存只有几兆.   回复  引用  查看    

#17楼  2007-04-29 09:41 testreport [未注册用户]

关键是.net框架垃圾自动回收机制不可靠,你看到了最小化后,占用内存只有几M,那是一个假象,那是操作系统把数据从物理内存移到了虚拟内存里,搞磁盘交换去了,性能进一步降低了。不信你可以关闭程序,再看总内存的变化。另我下了您的最新版程序,在做报表时,如果加了一个图表之后,在这个图表区域如果不小心再画一个其它的元素,程序crash。

  回复  引用    

#18楼 [楼主] 2007-04-29 11:57 袁永福      

程序crash那是我的程序有BUG,报表程序比较复杂,我的报表程序也是推出时间不长的,难免有BUG.对于这些BUG我会认真处理的.还望老兄以及其他使用者多多提出意见和建议。   回复  引用  查看    

#19楼  2007-05-02 22:10 C#初学者 [未注册用户]

真他妈的,聪明人也有迂腐的时候,这样的问题也会去研究.
就好像是在辩论男人与女人谁更重要一样无聊....   回复  引用    

#20楼  2007-07-05 00:12 胡明 [未注册用户]

真的怀疑作者的程序素养,作者可能对计算机底层一点不了解,纯粹扯淡。
  回复  引用    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: