在《性能调优攻略》里,我说过,要调优性需要找到程序中的Hotspot,也就是被调用最多的地方,这种地方,只要你能优化一点点,你的性能就会有质的提高。在这里我给大家举三个关于代码执行效率的例子(它们都来自于网上)
第一个例子
PHP中Getter和Setter的效率(来源reddit)
这个例子比较简单,你可以跳过。
考虑下面的PHP代码:我们可看到,使用Getter/Setter的方式,性能要比直接读写成员变量要差一倍以上。
<?php
//dog_naive.php
class dog {
public $name = "";
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
$rover = new dog();
//通过Getter/Setter方式
for ($x=0; $x<10; $x++) {
$t = microtime(true);
for ($i=0; $i<1000000; $i++) {
$rover->setName("rover");
$n = $rover->getName();
}
echo microtime(true) - $t;
echo "\n";
}
//直接存取变量方式
for ($x=0; $x<10; $x++) {
$t = microtime(true);
for($i=0; $i<1000000; $i++) {
$rover->name = "rover";
$n = $rover->name;
}
echo microtime(true) - $t;
echo "\n";
}
?>
这个并没有什么稀,因为有函数调用的开销,函数调用需要压栈出栈,需要传值,有时还要需要中断,要干的事太多了。所以,代码多了,效率自然就慢了。所有的语言都这个德行,这就是为什么C++要引入inline的原因。而且Java在打开优化的时候也可以优化之。但是对于动态语言来说,这个事就变得有点困难了。
阅读全文…

Loading ...
以前向大家介绍过Stack Exchange的系统架构和Facebook的系统架构,今天和大家说说Quora的。本文主要参考了Phil Whelan的这篇文章《Quora’s Technology Examined》。关于Quora是个什么网站我就不多说了,国内对他的C2C网站叫“知乎”。呵呵。我们还是来看看Quora的技术吧。
Search-Box
Quora只能搜索问题,主题标签,用户名,和主题标题。没有全文搜索,所以,你无法搜索问题和答案的内容。而搜索中使用前缀搜索方式,比如你输入mi,则Microsoft会马上出来。其搜索还会有一些非常简单的模糊匹配的算法。另外,如果有重复的问题,其中一个问题会自动跳转到另一个问题,但是在搜索中还是会出现。搜索中没有拼写检查。
一开始,他们使用的是一个开源的搜索服务器,叫Sphinx。其支持上述的那些功能。现在他们不用这个技术了,因为受到了一些限制。他们做了一个比较新的解决方案,这个算法由Python实现。
参看:
What libraries does Quora use for search?
实时查询
Quora的查询是非常高速的,其查询请求是通过AJAX的GET请求发送的,结果返回用的是JSON数据格式,但他们解析JSON是在服务器端,而不是通过浏览器的javascript。这么做的原因可能是他们想高亮搜索关键词,似乎使用Client端的Javascript非常不好做。
Quora的即时搜索好像比较暴力,如果你输入Microsoft(一共9个字符),你会看到其会像后端发送9次查询——每按一个键一次,无论你敲这个单词的速底有多快,每输入一个字符都会发一个请求给后台。对于这样的看上去没有效率的对后台的请求,后台的服务器端会来控制相关的前台请求,所以,就算是前台这样做,也不会增加服务器端的负载,因为后台会做相关的处理。
Quora的搜索使用HTTP长连接,当你开始敲查询的时候,连接就建立了,这个连接会持续在那里,你下次搜索的时候会继续使用这个连接,除非你60秒没有动作了。
参看:
Is Quora going to implement full-text search?
阅读全文…

Loading ...
看到一个网页收集了很多使用Python和PyGame写游戏的示例,分享给大家。(注:我不知道用Python/PyGame写游戏其性能会怎么样,但是一些小游戏应该是没有问题的)
这个网页同时给了一本介绍Python和PyGame的电子书(PDF),下面的这些例子就是这本书的示例。所有的这些示例可以打包下载。
基础 Python 示例
Pygame 图形示例
阅读全文…

Loading ...
又到了向大家介绍一些最近我在网上发现的有价值的东西的时候了。(下面的链接中很多都被墙)
- 本站的关于排序的文章有很多,对于排序算法来说,其受到要排序的个数和数据的杂乱程度的影响,我们知道比较稳定的排序算法是快速排序和归并排序,归并排序对于大量的数据排序效果是非常好的,尤其是我们可以进行并行的排序。这里有一个并行归并排序的算法的源代码,你可以参考一下 – “Parallel Merge Sort”。
- 这里有篇文章教你如何取得一个在线的哈佛大学的硕士学位,文章中说了一些相关的事宜,包括一些收费情况,并且展示了一张文凭。这里有一个网页说明了哈佛软件工程学位(Software Engineering)的所需要学习的科目,比如:Java和分布式计算,分布式/企业级计算,设计模式和Java,通讯协议,高级数据网络,Web开发,计算理论,Perl实践,Unix系统编程……我不知道我们的国家各个大学的硕士在学什么,因为我没有读过硕士,但好像现在的计算机研究生只是导师用来挣钱的免费资源,而且,实在不知道研究生在校研究什么。不管怎么样,从这看来,我们的大学好像并没有教给学生计算机的技术。比如在“如何学好C语言”和“如何学好C++语言”中我提到的那些书,那些才是大学里应该学的。我国的教育还真不是一般的落后,不过你不妨试试哈佛的在线学位。
阅读全文…
分类: Web开发, 技术读物, 杂项资源 标签: 64bits, Algorithm, Android, C++, ebook, Java, Python, UI, UX, 算法

Loading ...
这是一个开源项目:http://cycle.sourceforge.net/,其是用python写的。在项目的主页上说,这是一个给妇女用的日历程序,叫cycle,周期,给妇女的,我不多说了,你懂的。下面是一些介绍(请大家注意学习相关的英文单词)
当然,这个小程序不单单只是查看妇女的“周期”(menstruation),其还提供了以下的功能:
- 第一次的周期 – 在日历上显示为粉色。menstruation周期长度由用户输入的六次周期取平均值确定。
- 排卵期(Ovulation day)- 在日历上显示为亮绿色,
- 受精期 (Fertile period)- 在日历上显示为绿色
- 安全期(Safe Sex)
- 预产期(Date of birth)
- 还允许你记一些notes – 医生建议你服用一些荷尔蒙避孕药(hormonal contraceptive)
下面是屏幕截图 ——

注意以下的免责条款:
- 本程序并不能成为一种避孕的方法。
- 本程序也不能阻止各种性传染病,如:AIDS
- 本程序更不能取代你的妇科医生。
(全文完)

Loading ...

Loading ...
以前,本站介绍过去一种写HTML和CSS的新方法,以一种杂交式的代码,昨天给大家介绍了.NET代码和Python及Ruby代码的互相转换工具,但是这个世界可能比我们想像的还疯狂。IronPython 是一个在.NET平台上运行Python的东西,就像那些在JVM上运行其它语言的东东一样。当然,IronPython最邪恶的事情并不是在.NET上运行Python,而是在Javascript里写Python的语法。这个畸形混血儿的网址在这里(请注意翻墙)。
使用这个玩意很简单,下面,让我们看看这个混血儿长啥样?
首先,你需要链接一个js文件:
<script src="http://gestalt.ironpython.net/dlr-latest.js" type="text/javascript"></script>
然后,让我们看看如何写一个按钮事件:
<input id="button" type="button" value="Say, Hello!" />
<script type="text/python">
def button_onclick(s, e):
window.Alert("Hello from Python!")
document.button.events.onclick += button_onclick
</script>
你对此事怎么看?欢迎留下你的看法。

Loading ...
不知道大家有没有注意到StakeOverflow的404错误页面?其显示了下面的这个图片:

这个是一个很有意思的图片,不知道你看懂了吗?看上去像Python,又像 Ruby,还像 Perl,当然也有 C的影子,还有Brainfuck。是的,这是一个杂交程序,杂交了Python,Ruby,Perl,C,还有Brainfuck(注意其中的#号),所有的语句都是输出“404”字符串。
关于这种杂交程序,本站以前也发布过《C语言和sh脚本的杂交代码》,大家可以前往一看。这样的有趣的玩法叫“Polyglot”,也就是说,把N种语言写在一个文件中,然后,该文件在任何编译器下都可以运行,上述的那段代码在Python,Ruby,Perl,Brainfuck下都可以正常运行,也可以被C和的编译器编译通过,并被运行。
下面是这个图片的字符码,以供各位试试。
阅读全文…

Loading ...
用Python写过处理文本经常会遇到需要decoding或者encoding, 尤其是处理中文的时候。
encoding的问题处理起来是个脏活儿,报错不太容易看懂,网上相关资料不太好查。有同感?请继续读下去。
常规做法是读取文件的时候立刻decode, 所有的处理工作都用unicode,写会文件的时候encode. 但是等到读取的时候在处理的代码读/写起来都很别扭,感觉像穿上鞋以后袜子滑下来了…Python 3.1.1以上的版本解决了该问题。在Python 3.1.1中,打开文件可以加入encoding的参数:
file = open(filename, encoding='xxx')
啊,这样看起来终于舒坦了。 不同写如下的code了
file = open(filename)
for line in file:
decoded_line = line.decode('xxx')
do something else
提倡使用utf8

Loading ...
以前本站发布过一篇《程序员的进化》,以一种幽默的代码展现方式调侃了程序。下面这篇是关于Python程序员的。以阶乘为例,很有意思。
新手程序员
def factorial(x):
if x == 0:
return 1
else:
return x * factorial(x - 1)
print factorial(6)
第一年的刚学完Pascal的新手
def factorial(x):
result = 1
i = 2
while i <= x:
result = result * i
i = i + 1
return result
print factorial(6)

Loading ...
最新评论