以如下裴波那契数列为测试代码:

```javascript
function fibonacci(n)
{
if (n < 2) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
print('fibonacci(20):' + fibonacci(20));
```
当输入为10时的结果(单位:ms):

27 12-09 14:13:04.371 4816 4816 E BirdNest: fibonacci(10):55

29 12-09 14:13:04.371 4816 4816 I faywong : benchmark(v8): 537

31 12-09 14:13:04.391 4816 4816 I BirdNest: fibonacci(10):55

32 12-09 14:13:04.391 4816 4816 I faywong : benchmark(duktape): 2336

当输入为20时的结果:

59 12-09 14:15:38.621 9196 9196 E BirdNest: fibonacci(20):6765

61 12-09 14:15:38.621 9196 9196 I faywong : benchmark(v8): 1583

63 12-09 14:15:38.841 9196 9196 I BirdNest: fibonacci(20):6765

64 12-09 14:15:38.841 9196 9196 I faywong : benchmark(duktape): 189211

大致汇总下:在输入为10时,v8性能是duktape的4倍;

在输入为20时,v8性能是duktape的119倍,jsc是duktape的接近100倍

因为要与java后端协作,数据库得建成UTF-8编码的。折腾了半天,实在是没有办法,改了locale,重新安装postgresql-server,最终通过命令行指定编码和模板(这点很重要)这样蒙混过关:

命令行:

```bash
createdb --locale=en_US.utf8 --encoding=UTF8 --template=template0 test_db
```

然后确认下:

![psql_result](/uploads/2015_09_02_01.jpg)

今天在尝试优化json的序列化和反序列化。发现一个陷阱:
android自带的json比fastjson(fastjson-1.1.43)解析在9k(及以下)大小字符串输入下性能要高10倍,在解析19k大小字符串时性能高3倍。如下图所示:

三星Note 3:
![note 3](/uploads/2015_09_22_01.png)

一加1代:
![note 3](/uploads/2015_09_22_02.png)

详细数据如下:
json字符串体积: 6k,android终端:三星note3
```bash
09-22 11:42:55.234: D/faywong(7810): org.json.JSONObject consumes: 1ms to parse json
09-22 11:42:55.254: D/faywong(7810): com.alibaba.fastjson.JSONObject consumes: 15ms to parse json

json字符串体积: 9k,android终端:三星note3
09-22 11:11:45.944: D/faywong(26631): org.json.JSONObject consumes: 1ms to parse json
09-22 11:11:45.954: D/faywong(26631): com.alibaba.fastjson.JSONObject consumes: 15ms to parse json

json字符串体积: 19k,android终端:三星note3
09-22 11:48:15.844: D/faywong(11569): org.json.JSONObject consumes: 6ms to parse json
09-22 11:48:15.864: D/faywong(11569): com.alibaba.fastjson.JSONObject consumes: 19ms to parse json

json字符串体积: 6k,android终端:一加1代
09-22 11:39:55.304: D/faywong(12964): org.json.JSONObject consumes: 1ms to parse json
09-22 11:39:55.315: D/faywong(12964): com.alibaba.fastjson.JSONObject consumes: 11ms to parse json
json字符串体积: 9k,android终端:一加1代
09-22 11:30:06.378: D/faywong(11412): org.json.JSONObject consumes: 1ms to parse json
09-22 11:30:06.395: D/faywong(11412): com.alibaba.fastjson.JSONObject consumes: 17ms to parse json

json字符串体积: 19k,android终端:一加1代
09-22 11:53:30.551: D/faywong(14248): org.json.JSONObject consumes: 3ms to parse json
09-22 11:53:30.564: D/faywong(14248): com.alibaba.fastjson.JSONObject consumes: 13ms to parse json
```

总结下json序列化和反序列化的使用经验:
在能控制json序列化和反序列化的整个闭环中(比如服务端+客户端)使用fastjson之类的方案是有优势的;如果你只是在其中的一环,并不知道前边的json是谁以怎样的方式序列化/反序列化得来,建议你使用org.json版本,这样性能不至于很差。

今天由测试同学反映两款手机(红米,三星GS4,均搭载Android 4.2.2)存在WebApp中收到回调后软键盘自动收起。

经过一段时间的研究,发现在Android 4.2.2上WebView.loadUrl()被调用后WebView会认为新的一个页面即将打开,而将软键盘收起。

android填坑之旅还要继续……

源代码如下(以android 4.0.4为例):

```java
public synchronized String getUserAgentString() {
if (DESKTOP_USERAGENT.equals(mUserAgent) ||
IPHONE_USERAGENT.equals(mUserAgent) ||
!mUseDefaultUserAgent) {
return mUserAgent;
}

boolean doPostSync = false;
synchronized(sLockForLocaleSettings) {
Locale currentLocale = Locale.getDefault();
if (!sLocale.equals(currentLocale)) {
sLocale = currentLocale;
mUserAgent = getCurrentUserAgent();
mAcceptLanguage = getCurrentAcceptLanguage();
doPostSync = true;
}
}
if (doPostSync) {
postSync();
}
return mUserAgent;
}
```
其中后半段代码用于将当前locale设定同步到生成的UA中。所以该方法是有副作用的。

在一个使用了WebView的Activity里实例化完成和系统Configuration改变后都需要调用一次getUserAgentString()来让WebView的UA(前提是不要设置自己的UA,即没有针对此WebView调用过setUserAgentString)中locale分量与系统的设定保持一致。以免在访问多语言网站时出现适配问题。