程序结构:浏览速度VS模块化设计思想——我和同事的争论;请高手点评

hiryu 2003-09-11 11:34:40
我是在一家小网站做php开发的,刚上岗几天,今天和一位老同事关于结构设计问题展开争论,由于我们公司没有技术方面的权威性人士,所以就问题在这里请高手点评,我尽可能做到不包含个人感情,公正的叙述问题。

我对网站的设计方式是这样的:

=====下面这段是:/htdocs/templet/normal.html=====

<HTML>
///后面代码忽略
<body>
///top、left等部分,每页都一样,所以这里不留了

waiTbechange_main

</body>
</html>

====下面这段是:/htdocs/templet/error1.html====

<img border="0" src="../templet/img/icon_fail.gif" width="20" height="20">
抱歉,您输入的数据不完整或者格式有误
<br><br><br>

====另外error2.html还有其他的也类似不贴了====

====下面这段是:/htdocs/php/needsub.php====

<?
//输入文件位置,输出文件内容的函数
function get_templet()
{
$sfile=Func_get_arg(0);
$fd=fopen($sfile,'r');
$li_buffer = fread($fd,filesize($sfile));
fclose($fd);
return $li_buffer;
}
?>


====下面这段是:/htdocs/php/showuser.php=====
<?
include("../php/needsub.php");

$fgnormal=("../templet/normal.html");
$fgerror1=("../templet/error1.html");
$fgerror2=("../templet/error2.html");
$fgerror9=("../templet/error9.html");
//读取标准模板
$distishi=get_templet($fgnormal);

$re_makerup=is_right()//这个函数是自己编写,碍于篇幅不提

switch ($re_makerup)
{
case "0": ///状态判断,0表示显示正常页面
{

$dichange.="<TABLE bgColor=#000000 border=0 cellPadding=0 cellSpacing=1 width=620>
<TR>
<TD>客户姓名</TD>
<TD>性别</TD>
<TD>来访时间</TD>
<TD>查看信息</TD>
</TR>";
///SQL代码不提
while ($sql=mysql_fetch_row($result))
{
$dichange.="<TR><TD>".$sql[0]."</TD>";
$dichange.="<TD>".$sql[1]."</TD>";
$dichange.="<TD>".$sql[2]."</TD>";
$dichange.="<TD>".$sql[4]."</TD>";
}
$dichange.="</table>";
$distishi= ereg_replace("waiTbechange_main",$dichange,$distishi);
break;
}
case "1": //出错1的解决
{
$dichange=get_templet($fgerror1);
$distishi= ereg_replace("waiTbechange_main",$dichange,$distishi);
break;
}

case "2": //出错2的解决
{
$dichange=get_templet($fgerror2);
$distishi= ereg_replace("waiTbechange_main",$dichange,$distishi);
break;
}
default: //其他出错的解决
{
$dichange=get_templet($fgerror9);
$distishi= ereg_replace("waiTbechange_main",$dichange,$distishi);
break;
}
}
//最后显示
echo $distishi."<br><br><br>";

?>




在实际的网站上规模和数据量都要大很多,所以我的同时的观点是使用“模板技术本身没有错,只是你这里使用了变量叠加的方式增大了服务器的内存开销,我们目前没有比较成熟的摸板技术,所以应该这样写”我在下面附上部分他的代码


=======/htdocs/php/showuser.php=========

<HTML>
///后面代码忽略
<body>
///top、left等部分,每页都一样,所以这里不留了
<TABLE bgColor=#000000 border=0 cellPadding=0 cellSpacing=1 width=620>
<TR>
<TD>客户姓名</TD>
<TD>性别</TD>
<TD>来访时间</TD>
<TD>查看信息</TD>
</TR>
<TR>
<TD>
<?
echo ......
//他的代码我不敢贴,就是取数据库并显示
?>
</TD>
<TD>
<?
echo .......
?>
</TD>
<TD>
<?
echo .......
?>
</TD>
<TD>
<?
echo .......
?>
</TD>
</TR>

........
</TABLE>
</body>
</html>



其实他写得蛮复杂的,只是我为了举例说明,将他和我的代码都只用模型,够说明问题就是了。

请高手、大师指点,或者您有比较成熟的摸班技术也请教教我们这些半瓶水的庸人 hiryu@tom.com

凭心而论,那位同事的数据库能力比我强得多,所以我很希望能够能够及早结束这次争论,快速、稳定的进入团队开发阶段。

拜托各位了。

PS:各位帮着up啊
...全文
178 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
wingoffire 2003-09-12
  • 打赏
  • 举报
回复
为什么不使用Smarty模板?他可以cache你的输出,这样在不改变源代码的情况下,模板只需要编译一次,以后调用就很快了,你同事的做法比较方便,但是并不适合团队的开发。
多菜鸟 2003-09-12
  • 打赏
  • 举报
回复
关注
ashchen 2003-09-12
  • 打赏
  • 举报
回复
jsp的类内存调用方式不是很清楚,但是第一次访问的时候肯定要编译的
再次调用的时候我怀疑已经缓存了,或者直接用class文件不需要重新解释
故在访问量大的时候也不会造成很大的瓶颈。

而php的类每次访问请求都要解释一遍,没有预编译,也没有缓存,从头到脚

web服务的特征是访问的页面比较集中(比如首页的访问量最大),需要缓存的支持
那些高手写的程序都注意了这些问题,当然还有很多影响速度的方面,不赞成fnaps(blue) 兄所说 根本没必要争这十个人 ,积少成多,当注意这些问题的时间久了就成习惯成经验了
ashchen 2003-09-12
  • 打赏
  • 举报
回复
中小型网站用过程,大中型用对象
php的对象特征不是很明显,不像应用程序那样事件频繁
何况现在的php对象支持很有限,要用对象用jsp去,争到最后还是没结果
模板编程肯定要用到include ,大家都知道打开一个文件需要时间,访问量大的会造成
频繁的读写磁盘,我想对硬盘的老化不无影响吧。
如果你的公司是一个很系统的公司,项目管理都非常的严格规范,那么就用模板面向对象
公司比较小,项目不多但是很杂,那就怎么快则么开发
All roads lead to Rome
i三千 2003-09-11
  • 打赏
  • 举报
回复
up
hiryu 2003-09-11
  • 打赏
  • 举报
回复
解释一下,我这位同事将数据库查询写入类里面,然后可以在后面的变量中调用,不存在多次查询数据库的情况
blueoxygen 2003-09-11
  • 打赏
  • 举报
回复
如果我的话,支持你的代码…
看他的好像就是无数的数据库操作阿
不使用模板技术…
hiryu 2003-09-11
  • 打赏
  • 举报
回复
人气好低啊,,自己up一下
indeed 2003-09-11
  • 打赏
  • 举报
回复
up.....
allkill 2003-09-11
  • 打赏
  • 举报
回复
关键是如果不用模板技术开发大型的程序特别费劲了。
xxu 2003-09-11
  • 打赏
  • 举报
回复
另外两个函数分开执行,其结果是相当接近的。
xxu 2003-09-11
  • 打赏
  • 举报
回复
测试文件修改部份如下:

f4 加echo $str;





//require_once "template.php";
//require_once 'Benchmark/Iterate.php';
function run($p1,$p2)
{
$s=microtime();
for($i=0;$i<$p1;$i++)
$p2();
$e=microtime();
//返回的时间格式为:0.07600400 1063270905
$s=substr($s,11,12).substr($s,1,9);
$e=substr($e,11,12).substr($e,1,9);
return $e-$s;
}
//$rs1=run(100, 'f1');
//$rs2=run(100, 'f2');
//f3() TrimChinese:0.07600400 1063270905:0.66673800 1063270905
//f4() TrimChinese:0.66680000 1063270905:0.43966500 1063270906
$rs3=run(1000, 'f3');
echo "<br><hr>fun4();<br>";
$rs4=run(1000, 'f4');
//echo 'f1() TrimChinese:'.$rs1."<br>";
//echo 'f2() TrimChinese:'.$rs2."<br>";
echo 'f3() TrimChinese:'.$rs3."<br>";
echo 'f4() TrimChinese:'.$rs4."<br>";



xxu 2003-09-11
  • 打赏
  • 举报
回复
xuzuning(唠叨) ,我已对源文件修改过后调试了下(只运行了f3()及f4())。发现数据量少时,运行速度不太稳定。我把运行次数改为1000,产生数据如下:
第一次:
f3() TrimChinese:1.22622609138
f4() TrimChinese:1.24362099171
第二次:
f3() TrimChinese:0.975206017494
f4() TrimChinese:0.943042993546
第三次:
f3() TrimChinese:1.32042789459
f4() TrimChinese:0.933300971985

产生的文件有1.85M


xuzuning 2003-09-11
  • 打赏
  • 举报
回复
不敢勾通 xiangtx(SmileSweet) 的观点。任何事物都有两面性的,为强调某一方面的优点而偏颇另一方面。这肯定不是良好的治学态度。
微软的系统就是你所谓的“重复利用前人的成果”吧?从vwin3的5m(虽然还算不上操作系统)到win95的12m到win98的22m到win2000的280m....
不要忘记这期间硬件的性能提高了上千倍!
xuzuning 2003-09-11
  • 打赏
  • 举报
回复
谢谢 xxu(焕兄) 的提醒,在f4() 最后应加上echo $str;
但结果并没有质的变化
f1() TrimChinese:0.071436
f2() TrimChinese:0.073361
f3() TrimChinese:0.069446
f4() TrimChinese:0.020406

Benchmark/Iterate.php在php/pear中,自己写一个也不难。

另外,echo 是立即输出的,这一点是不争的事实。
xxu 2003-09-11
  • 打赏
  • 举报
回复
用模板跟不用模板性能相差一半左右,这已经很不错了(如果模板复杂,性能影响应该会更大)。试想,模板就是“程序中的程序”,几乎是两倍解析执行了。
xiangtx 2003-09-11
  • 打赏
  • 举报
回复
模块化设计比速度重要一些,即使对某些比较关键的部分也是一样。
如果结构设计没有本质性的错误,不要轻易地改变它。
计算机的优势在于可以重复利用前人的成果,如果每个人都为了性能的小部分提升而修改程序主题结构,它所浪费的人力物力远比得到的要多。
xxu 2003-09-11
  • 打赏
  • 举报
回复
xuzuning(唠叨)
我发现你所列的测试文件中犯了一个很大的错误:f4() 未输出结果!

一个echo涉及到PHP跟WEBSEVER,WEBSERVER跟浏览器之间的通信,有没有echo,性能的差异性可想而知了。
再则我认为echo不会立即输出结果的,肯定设置了一个缓出缓冲区的。这样的话,就没必要先存在一个变量里了。直接输出即可。
xxu 2003-09-11
  • 打赏
  • 举报
回复
xuzuning(唠叨) 请提供,
Benchmark/Iterate.php
我来测试一下。
xxu 2003-09-11
  • 打赏
  • 举报
回复
1、相比之下,你的同事代码要比你好一个层次。
因为他的代码可以配合网页设计工具(如DW)进行可视化设计界的。代码运行将来的效果,直观多了。
而你的代码看起来都累。以后维护时要改变输出都麻烦(我维护过这样的代码)
2、两者都不是通常讲的模板技术。用模板就是界面尽可能与程序分开。好处,美工和程序员可以更好地做本职工作,相同之间的必要交流可以少很多。
一般要你在程序读取HTML文件中设置的参数来交互的。
3、你的代码:
$dichange.="<TD>".$sql[1]."</TD>";
$dichange.="<TD>".$sql[2]."</TD>";
你的数据库的取值不要用索引数值。这样以后修改数据表你的程序就很可能要修改。别人也不好读懂。(你在以后也一样会忘的)
4、数量比较多的<??>,感觉性能会降低很多,实际运行情况是,没感觉出来。

加载更多回复(4)

21,882

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧