• 作者: Laruence

  • 转载请注明出处

前段时间听说了一个问题,说是,javascript中使用+=来拼接字符串会比使用Array的join方法慢几十倍以上,今天在工作间歇,就写 了个例 子验证了一下,结果确完全相反,使用+=比join要快(在50000个简单拼接循环)200多milliseconds,真是很意外,最后经过仔细研 究,发现原因再于,我使用的测试环境,Firefox(Ubutun), 呵呵,原来是这样的。 在IE下,确实使用Join要比+=快几十倍,但,在IE下它们整体要比firofox慢1个数量级; 在ie下解释为什么+=比join慢的原因,是因为,在IE下,String是固定内存的,每次+=都会重新分配内存。而使用Array的join方法则 不会。 而为什么IE下整体要比firefox慢,是因为,IE的垃圾回收机制,每次重新分配内存以后,都会回收废弃的内存,目前只是猜测,因为IE的整体内存使 用要比firefox少很多,firefox的垃圾回收机制是和IE完全不一样的。还没有经过验证,但知道这个结论就够了。 不过,目前来说,因为绝大多数网民还是使用IE系列的浏览器多点,所以在大型的js工作中,还是可以考虑用Array的join代替+=。

 

开发中遇到发送邮件,用户等待时间过长的问题,之后找到一种解决方案:

本文转载自贝贝《使用fsockopen实现“无需等待返回”之效果》

有时候执行某段PHP程序,需要耗时较长,但是用户却不需要关心,或者

不需要等待该执行结果,这样的等待就影响了用户体验。譬如当使用AJAX时,

需要等待后台执行的结果,但后台程序又包含某一段功能--如发送邮件这种

可能耗时相对比较长(因需等待邮件发送的返回结果)--而邮件发送的这个功能

恰巧不是前端AJAX需要关心的,这时候就会影响到用户的体验。

而通过fsockopen()进行伪多线程的方式可以解决这个困扰。在PHP服务支持

fsockopen,需要设定php.ini的allow_url_open = On。fsockopen()函数可以以socket

模拟HTTP协议进行类似真实的HTTP操作,包含POST、GET方式等。

参考如下程序,为后台执行处理段,其中包含邮件发送,现把邮件发送的功能

提取放置于fmail.php,

$param = array(
'mail_addr' => $mail_address,
'title' => $title,
'ltext' => $ltext
);
$param = http_build_query($param);
$sockopen = fsockopen('localhost',80,&$errno,&$errstr,5);
if(!$sockopen)
{
echo "error!$errstr ($errno)<br />\n";
}

$sendm = "POST http://localhost/webroot/comm/fmail.php HTTP/1.1\r\n";
$sendm .= "Host:localhost\r\n";
$sendm .= "Content-type:application/x-www-form-urlencoded\r\n";
$sendm .= "Content-length:".strlen($param)."\r\n";
$sendm .= "Connection:close\r\n\r\n";
$sendm .= $param;
fwrite($sockopen,$sendm);
fclose($sockopen);


而fmail.php透过$_POST[]的方式获取变量值进行处理。

过程中需注意

1、POST关键字要全部为大写,为Post也不能正常传输

2、格式要正确,如回车符,需要连续两个的要保持。

3、发送地址需写为绝对路径。

开发中遇到的问题与解决方案_PHP