Javascript 字符串 数字 浏览器 性能差别

我在做一个 Javascript 版的公历农历转换程序,功能完成后,需要对性能做优化。计算算法是在网上找的,原作者对历法的转换很精通,但对程序性能没有仔细考虑,当计算量大的时候,会给用户的浏览器造成很大压力,给用户的感觉就好像浏览器假死一样。

我花了2天时间在性能优化上,并在不同的浏览器下做对比测试,发现一个比较重要的差别,IE、Firefox 和 Chrome 之间的区别很大。

通常,生成一个月的日历,最多需要计算42天(可参考Google Calendar,每行代表一周7天,最多可能有6行)。

性能测试的时候,我让程序连续计算3年,共36个月,1000多天。

总的运行时间是:

IE7: 2.828 s
Safari3: 1.016 s
Firefox3: 0.885 s 
Opera9: 0.765 s
Chrome: 0.281 s

这下终于见识了 Chrome 采用的 Javascript V8 引擎的强大实力! 

以上统计结果都是测试3次取结果平均值。

程序运行到这个时间量级,已经是我优化过了的,最开始的程序,完成2年的计算,也就是上述运算量的三分之二,Firefox3用了8秒左右,Chrome很棒,用了2秒,而IE,30秒过后,浏览器直接问我是否要强制停止脚本运行,实际上我还从来没有在IE上成功执行过!

关于浏览器性能的差别,你可以用IE和Chrome打开淘宝的同一个比较复杂的页面,感受一下拖拉机与飞机的区别。

上面是浏览器的差别,下面我再给一些 Javascript 程序上的差别。

我的农历转换算法,有一个关键函数,需要多次调用,这个正是性能的瓶颈所在。

观察了调用方式和次数,这个函数运行了33000多次,而总共参数的变化只有1000次左右,如果加入缓存,可以减少97%的运算量!!!

我采用hash表的方式对每个输入的key做缓存,由于函数的参数是年月日,共3个,所以需要把这3个参数拼接成一个key。

最开始,我用字符串拼接,y m d 之间用 “_” 下划线连接起来,但仅仅是一个这样的字符串操作,程序运行时间就从0.8秒增加到1.1秒,增加了将近40%的时间!!

这是不能接受的,这将使我的缓存优化方式变得毫无意义。

农历算法的大部分关键代码,都是数字上的计算,代码很多,但好像没有产生性能瓶颈,这给了我启发。

我改用数字索引,把 y m d 用加法和乘法算出类似于 20081026 这样的整数,这样运行时间从0.789 s增加到0.853 s,只有不到10%的增加。

我的缓存,只能把运行时间降低20%到30%,所以用整数索引,可以达到优化的目的。

http://leakon.googlecode.com/svn/trunk/leakon/javascript/wannianli/nice/

很愿意与大家一起分享,一起分析,一起应用~~

原创文章,请尊重我对互联网的贡献,谢谢!

Tags: ,

position static 屏幕滚动

这个黄色背景的提示框,样式定义中 position 设置为 static,因此可以精确地定位到输入框的下方,并且覆盖住原有的内容。达到这样的效果,static 值是必须的,他使该元素脱离于原有的元素布局,可以浮动到父层容器内的任何位置。

请注意这个父层容器,通常 static 元素只能在父层元素的容器内显示,具体位置用 left 和 top 属性决定。

这本来没什么问题,不过,当浏览器的窗口不能完整容纳整个页面,而出现滚动条时,就会出现问题。

如果提示框定义在 body 元素内,那么当滚动页面时,提示框会保持与浏览器窗口的位置不变。但此时提示框与页面元素的相对位置会发生变化,也就是相对位置不同步了。

就拿图示的例子来说,向下拖拽滚动条,文字输入框会向屏幕上方移动,但黄色提示框则保持不动,因为他的 position 相对位置的参照物是浏览器,而不是页面顶部。

如果想让输入框和提示框保持同步,则需要把提示框定义在与输入框相同的父层容器内。

这时 position 的 left 和 top 的参照物就是父层容器了,拖拽滚动条,输入框和提示框的相对位置会保持不变。

从合理的角度来说,如果整个页面有多处需要提示框,则应该在 body 下面定义一个全局的 div,在需要显示的位置,通过绝对定位调整提示框的 left 和 top。

但这样没法保证页面滚动时提示框与预期位置同步。

在每个需要提示框的地方,都定义一个独立的输入框,则可以避免同步的问题,但页面会存在过多的 dom 节点,容易造成浏览器内存泄露,或者导致浏览器打开页面速度缓慢。

殊死抵抗 wga 解决微软盗版黑屏问题 Wgalogon 黑屏修复工具

互联网的万恶之源微软,据说今天就要下黑手向广大的中国人民开战了!

作为长时间受美帝国资本主义疯狂欺压的勤劳善良的中国人民的一员,我有责任,有义务,有必要,有能力为大家收集一些用来反抗的武器!

按照微软的计划,从今天起,验证用户是否使用正版的两个程序就将发出,一旦用户升级,盗版者将接收到微软最直接明显的提醒:每小时黑屏一次。

这还只是庞大的“提醒”计划中的一部分,根据微软公布的消息,这些“提醒”措施针对WindowsXP专业版用户,以及办公软件OfficeXP、Office2003和Office2007的用户。

一旦被验证为“盗版”,用户的电脑桌面将变为黑色,并出现对话框,提示用户“是盗版软件的受害者”,与此同时,用户的办公软件界面上也将出现“盗版”相关标识。

我收集到的几个个工具,可以帮助大家迅速破解这个”提醒“。

关闭自动更新

1、我的电脑-属性-自动更新-关闭自动更新 
2、开始-运行(输入services.msc)— 禁用Office Source Engine和Automatic Updates 

 

使用批处理文件

@echo off
sfc /purgecache
reg delete “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\Wgalogon” /f
taskkill /f /im WgaTray.exe /T
del c:\Windows\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\Windows\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\Windows\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\Windows\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\WINNT\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\WINNT\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\WINNT\system32\WgaTray.exe /f /q
echo. & pause

把上面的复制到记事本里保存,把记事本的后缀 txt 改成 bat,然后运行。

我已经给大家做好了这个批处理文件,大家可以直接下载:

http://down.leakon.com/software/2008/10/RemoveWGA_20081020.bat

 

清理注册表

开始-运行-输入REGEDIT回车,在左边栏中找到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WgaLogon项

将整个WgaLogon项删除即可。

以上为经过测试的最简便方法。

同样,我也准备好了这个文件,供大家下载:

http://down.leakon.com/software/2008/10/RemoveWGA_20081020.reg

下载完成后,只写双击运行这个注册表文件即可。

 

修复小工具

XP反盗版黑屏修复工具 2.0

新增:新加入绿色免疫功能,适用于还未出现黑屏的用户(也就是还未安装WGA补丁的)。

进行免疫之后,即便开启自动更新或者直接安装反盗版补丁也不会出现异常。

给大家提供下载:

http://down.leakon.com/software/2008/10/RemoveWGA_20081020.exe

 

希望能给大家提供有用的帮助~~

 

Tags: , , , ,

十年

昨天参加初中同学聚会,看到了十年没有见到的老同学。大家还都是老样子,变化不大。有些已经结婚了,有的马上要结婚。算上这个,变化就太大了。

迎风中学,初四5班。

我们的学校已经没有了,我们的教室也变样了,不过我们43个同学团结在一起度过的四年初中生活,是我们此生永远不会忘记永远不会改变的回忆。

这四年中,我当了三年班长,可能这是我给大家留下的印象比较深刻的回忆了,虽然我这个班长没有以身作则,没有给大家往好路上带。

记得那会儿,罢课、逃课、打架……,干坏事儿的时候总有我,而且其中大部分都是我带头……

昨天的聚会,我迟到了。当我同时看见12位久未谋面的同学的时候,一种特别亲切的感觉一下子把我带回了十年前。聚会前因害怕好久不见会有些生疏而产生的担心,在那一刻瞬间消失。

是的,我们5班的同学,就算再久没有见面,聚在一起,也不会有生疏的感觉!

初中同学之间的关系,应该是最单纯最真切的,没有勾心斗角,只有嬉笑怒骂。

就像张晶说的那样,我们走进社会后,会接触不同的人,结交不同类型的朋友,但那份感觉,跟初中同学的感觉是完全不同的。初中关系最好的朋友们,在十年后的今天,仍然是关系最好的朋友。我跟几个发小之间的友谊就是在初中时代建立起来的。虽然我们也不是经常见面,但每隔几个月,大家都会找机会在一起聚聚,聊聊,不会让距离淡化感情!

聚会比较有意思的一个环节,是在KTV唱歌,大家玩了一会儿后,都停了下来,每人说说聚会的感言。说着说着,大家就开始复原在回忆中保存了十年的故事,你说一句,我补充一句,让我们有些模糊的记忆又回到了最新鲜的状态~~

想说的话太多太多,积累了十年的感情,无法在几个小时内全部释放。

我离开那间教室,已经十年。

但我每次在梦中延续校园生活时,地点总是定格在那件虽然破旧但干净整齐的教室。

本来这次聚会通知了20多个人(在此表扬一下亚旎和张晶为组织大家聚会付出的努力),但由于各种原因,有些同学没能参加,我们都很遗憾。不过我知道大家都很期盼着下次聚会能见到更多曾经最为熟悉的面孔。今天是征宇举办婚礼的日子,昨天我们聚会的时候,大家都为你举杯庆贺!我也再次祝你新婚快乐!

希望5班的同学们都能身体健康,工作顺利,家庭幸福,班长祝福你们!

Google IP

Google 的 IP 再次被封!

216.239.32.21 
216.239.34.21 
216.239.36.21 
216.239.38.21

这些是原有Google的IP列表,现在32和36已经被无耻的GFW封了。

我whois查了一下这些IP:

OrgName:    Google Inc. 

OrgID:      GOGL

Address:    1600 Amphitheatre Parkway

City:       Mountain View

StateProv:  CA

PostalCode: 94043

Country:    US

 

NetRange:   216.239.32.0 – 216.239.63.255 

CIDR:       216.239.32.0/19 

NetName:    GOOGLE

NetHandle:  NET-216-239-32-0-1

Parent:     NET-216-0-0-0-0

NetType:    Direct Allocation

NameServer: NS1.GOOGLE.COM

NameServer: NS2.GOOGLE.COM

NameServer: NS3.GOOGLE.COM

NameServer: NS4.GOOGLE.COM

 

比较可喜的是,Google的IP范围还算不少,从32.0到63.255,应该够GFW折腾的了。

如果你想使用Google的绑定域名服务,那你必须把你的域名CNAME到ghs.google.com。

但这个域名的IP早就被封了,你只能自己添加一个A记录,把IP改为上述范围中的一个能用的值。

然后再把你的二级域名CNAME到你刚添加的A记录上。

如果你嫌麻烦,我可以给你提供一个免费的Google域名主机:

google-host-00.leakon.com

我会写程序定期检查这个IP是否能ping通,如果失败,我会立刻更换这个域名的IP。

你需要把域名指向Google的话,可以CNAME到我这个域名,以后就可以不用再担心被封的问题。

如果IP被封,我这边可以在24小时内保证新IP生效,对你的应用来说,这一切都是透明的。

万恶的GFW,不干缺德事,你就会死吗?

Tags: ,

Thinkpad 打开 IE7 标签 很慢 解决方法

使用 Thinkpad 笔记本在运行 IE7 浏览器,打开新窗口或标签页的时候,经常需要等待好几秒才有反应。
这主要是由于lenovo的2个加载项造成的:

CPwmIEBrowserHelper Object
ThinkVantage Password Manager

把这 2 项禁用后,效果就会改变很多。

修改方法如下:

IE7下 工具 -> 管理加载项 -> 启用或禁止加载项。

打开后,你会看到有很多加载项,远不止这 2 个。

每一项后面都有说明,把没用的都去掉,再试试,快多了~~

如图:

Tags: ,

flash wmode 参数详解 解决 flash 覆盖问题

转自:http://www.neoy.cn/?p=158  多谢博主的文章,帮我解决了大问题~~

在做web开发中可能会遇到flash遮挡页面中元素的情况,无论怎么设置flash容器和层的深度(z-index)也无济于事,现有的解决方案是在插入flash的embed或object标签中加入”wmode”属性并设置为wmode=“transparent”或”opaque”,但wmode属性到底是什么意义,为什么可以解决这个问题呢?

window mode(wmode)

wmode即窗口模式总共有三种,看看当年Macromedia官方的说法:

  • Window: Use the Window value to play a Flash Player movie in its own rectangular window on a web page. This is the default value for wmode and it works the way the classic Flash Player works. This normally provides the fastest animation performance.
  • Opaque: By using the Opaque value you can use JavaScript to move or resize movies that don’t need a transparent background. Opaque mode makes the movie hide everything behind it on the page. Additionally, opaque mode moves elements behind Flash movies (for example, with dynamic HTML) to prevent them from showing through.
  • Transparent: Transparent mode allows the background of the HTML page, or the DHTML layer underneath the Flash movie or layer, to show through all the transparent portions of the movie. This allows you to overlap the movie with other elements of the HTML page. Animation performance might be slower when you use this value.

window 模式

默认情况下的显示模式,在这种模式下flash player有自己的窗口句柄,这就意味着flash影片是存在于Windows中的一个显示实例,并且是在浏览器核心显示窗口之上的,所以flash只是貌似显示在浏览器中,但这也是flash最快最有效率的渲染模式。由于他是独立于浏览器的HTML渲染表面,这就导致默认显示方式下flash总是会遮住位置与他重合的所有DHTML层。

但是大多数苹果电脑浏览器会允许DHTML层显示在flash之上,但当flash影片播放时会出现比较诡异的现象,比如DHTML层像被flash刮掉一块一样显示异常。

Opaque 模式

这是一种无窗口模式,在这种情况下flash player没有自己的窗口句柄,这就需要浏览器需要告诉flash player在浏览器的渲染表面绘制的时间和位置。这时flash影片就不会在高于浏览器HTML渲染表面而是与其他元素一样在同一个页面上,因此你就可以使用z-index值来控制DHTML元素是遮盖flash或者被遮盖。

Transparent 模式

透明模式,在这种模式下flash player会将stage的背景色alpha值将为0并且只会绘制stage上真实可见的对象,同样你也可以使用z-index来控制flash影片的深度值,但是与Opaque模式不同的是这样做会降低flash影片的回放效果,而且在9.0.115之前的flash player版本设置wmode=”opaque”或”transparent”会导致全屏模式失效。

了解了各种模式的实现方式和意义在以后的开发中就可以按照具体情况选择设置wmode属性的值了。

Tags: , , ,

Zend Optimizer not installed 问题解决

今天土了一把,遇到很简单的问题,却用了很久才搞定。

yoyoxuebaobao 装 SupeSite,提示 “Attention:zend optimizer not installed”,可是明明安装了,用 phpinf() 检查,也提示:

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.3.0, Copyright (c) 1998-2007, by Zend Technologies

这让我很恼火。

到网上查了半天,原来是 php.ini 中 zend_optimizer.enable_loader 的值设置为 0,也就是默认没有开启!

设置为 1 后立刻搞定~~

问题很弱,希望能给遇到同样问题的朋友们提供帮助~~

Tags: ,

IE6 float 显示异常 消失问题 解决方法

上一篇日志中写了 IE6 对 float 元素显示不正常的问题,现在找到了一个解决办法。

测试了很多次,发现跟 margin 和 padding 没有直接的关系,本质的问题根源在于,包含 float 元素的外层 div,没有设置足够的宽度和高度,也就是说,这个容器没有足够的空间用来显示内部所有的 float 元素。

margin 和 padding 只是一个间接原因,如果没有内外边距,可能外层 div 刚好可以容纳内部的 float。

加上边距后,每个 float 占用的空间就变大了,首先带来的问题是 div 的宽度不够,那么,愚蠢的 IE6 就会产生莫名其妙的问题,反映给用户的现象就是出现鬼影。

解决方案:准确计算内部 float 元素加在一起占用的宽高,确保外层 div 在 css 中明确指定了具体的 width 和 height 像素值,问题不会再出现。

可悲啊,95% 以上的桌面浏览器被这样愚蠢、垃圾的 IE6 霸占着!!!

Tags: ,

IE6 float 异常 消失

IE6 浏览器对 float 属性的元素显示不太正常,经常遇到的情况是,打开页面,发现某个区域的内容是空的,什么都不显示,但鼠标移动到那个区域,或者附近的一些区域时,那个空的区域立刻显示出原有的内容。

另一个 case 可以称之为“鬼影”,现象是,某串文字,会在 2 个位置同时显示,如果有 hightlight 效果,那么任凭你把光标放到二者任意一个上面,另一串文字也会立刻高亮。

以前对这个问题很抓狂,也没有总结出一个很好的解决方法。

今天又碰到类似的问题,查了一下 Google,有人给出一个结论,当某个元素有 float 属性时,再给他添加 padding 或 margin 等属性,在 IE6 下可能会出现显示问题。

具体的解决方法我总结一下会发布到 Blog 上。

这篇文字算是一个 bug 记录吧。

Tags: ,