Fastjson、json-smart、android系统自带json效率测试疑惑?

Easince 发布于 2013/03/19 13:56
阅读 4K+
收藏 0

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

    我在Android系统下对如题提到的三种json解析器做了下效率测试,可是我觉得测试结果有点难以置信,就把测试代码贴出来,大伙给看看。

package com.example.traceviewdemo;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	
	private String testString = null;
	private static final int TEST_COUNT = 10000;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();
		jsonObject.put("name", "onetwothree");
		jsonObject.put("year", "25");
		jsonObject.put("address", "上海市浦东新区盛夏路1107弄58号");
		jsonObject.put("father", "爸爸");
		jsonObject.put("mother", "妈妈");
		jsonObject.put("note", "Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。" +
				"");
		jsonObject.put("uri", "www.baidu.com/xiaolifan");
		jsonObject.put("others", "没有了,好长啊!");
		testString = jsonObject.toString();
		
		findViewById(R.id.button1).setOnClickListener(clickListener);
		findViewById(R.id.button2).setOnClickListener(clickListener);
		findViewById(R.id.button3).setOnClickListener(clickListener);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	private OnClickListener clickListener = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			if (v.getId() == R.id.button1) {
				//fastjson
				long startTime = System.currentTimeMillis();
				for (int i = 0; i < TEST_COUNT; i++) {
					com.alibaba.fastjson.JSONObject testJsonObject = com.alibaba.fastjson.JSONObject.parseObject(testString);
					Log.i("test", "the name is " + testJsonObject.getString("name"));
					Log.i("test", "the year is " + testJsonObject.getString("year"));
					Log.i("test", "the address is " + testJsonObject.getString("address"));
					Log.i("test", "the father is " + testJsonObject.getString("father"));
					Log.i("test", "the mother is " + testJsonObject.getString("mother"));
					Log.i("test", "the note is " + testJsonObject.getString("note"));
					Log.i("test", "the uri is " + testJsonObject.getString("uri"));
					Log.i("test", "the others is " + testJsonObject.getString("others"));
				}
				
				long endtime = System.currentTimeMillis();
				double time = ((endtime - startTime)*1.000000f) / TEST_COUNT;
				((Button)v).setText(time + "");
			} else if (v.getId() == R.id.button2) {
				//jsonsmart
				long startTime = System.currentTimeMillis();
				for (int i = 0; i < TEST_COUNT; i++) {
					net.minidev.json.JSONObject testJsonObject = (net.minidev.json.JSONObject) net.minidev.json.JSONValue.parse(testString);
					Log.i("test", "the name is " + (String)testJsonObject.get("name"));
					Log.i("test", "the year is " + (String)testJsonObject.get("year"));
					Log.i("test", "the address is " + (String)testJsonObject.get("address"));
					Log.i("test", "the father is " + (String)testJsonObject.get("father"));
					Log.i("test", "the mother is " + (String)testJsonObject.get("mother"));
					Log.i("test", "the note is " + (String)testJsonObject.get("note"));
					Log.i("test", "the uri is " + (String)testJsonObject.get("uri"));
					Log.i("test", "the others is " + (String)testJsonObject.get("others"));
				}
				
				long endtime = System.currentTimeMillis();
				double time = ((endtime - startTime)*1.000000f) / TEST_COUNT;
				((Button)v).setText(time + "");
			} else {
				long startTime = System.currentTimeMillis();
				for (int i = 0; i < TEST_COUNT; i++) {
					com.alibaba.fastjson.JSONObject testJsonObject = com.alibaba.fastjson.JSONObject.parseObject(testString);
					Log.i("test", "the name is " + testJsonObject.getString("name"));
					Log.i("test", "the year is " + testJsonObject.getString("year"));
					Log.i("test", "the address is " + testJsonObject.getString("address"));
					Log.i("test", "the father is " + testJsonObject.getString("father"));
					Log.i("test", "the mother is " + testJsonObject.getString("mother"));
					Log.i("test", "the note is " + testJsonObject.getString("note"));
					Log.i("test", "the uri is " + testJsonObject.getString("uri"));
					Log.i("test", "the others is " + testJsonObject.getString("others"));
				}

				long endtime = System.currentTimeMillis();
				double time = ((endtime - startTime) * 1.000000f) / TEST_COUNT;
				((Button) v).setText(time + "");
				
			}
		}
	};

}
测试结果如下图:

从上到下依次为:fastjson\json-smart\系统自带解析器


加载中
0
Boblin
Boblin
好吧  看到这些代码头就疼了。。。。。。
羅立安的眼光
羅立安的眼光
看到就给跪了
0
Easince
Easince

引用来自“Boblin”的答案

好吧  看到这些代码头就疼了。。。。。。
呵呵,随便写了下,是有点乱,将就点看吧,还望给个答复。
0
夲仒無道
夲仒無道
fastJson比系统自带的还要慢?
Easince
Easince
就是因为这个我才产生了疑问啊!
0
wenshao
wenshao
这个代码我看不懂啊
Easince
Easince
好吧,我再整理出个Java版本,一定要搞清楚怎么回事!
0
cr1944
cr1944
玉兰香苑3期
Easince
Easince
好吧,上面代码里面有!晕死
Easince
Easince
次奥,你怎么知道?
0
Tomato9527
Tomato9527
你的button3调用的也不是fastjson吗。。。无语了
0
Easince
Easince

引用来自“Roy_Hsu”的答案

你的button3调用的也不是fastjson吗。。。无语了
终于有人说了点有用的了,怪不得每次测试结果1和3差不多。可是根据测试结果fastjson没有smart快啊,我疑问的是这个点。
0
王学超
王学超
论解析,smart最快,其次是系统自带,fastjson是序列化和反序列化快,不是解析快
0
Easince
Easince

引用来自“王学超”的评论

论解析,smart最快,其次是系统自带,fastjson是序列化和反序列化快,不是解析快
高人在此,谢谢!
0
darkengine
darkengine
想问一下,楼主有没有比较过json-smart, msgpack和protobuf的优劣呢
Easince
Easince
没有
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部