Java 尝试测试2个JSON框架的性能-看起来正确吗?

Java 尝试测试2个JSON框架的性能-看起来正确吗?,java,android,json,jackson,gson,Java,Android,Json,Jackson,Gson,在我的应用程序中——我使用JSON进行序列化,到目前为止——我使用的是GSON。好吧,这有点慢,尤其是我加载对象的初始登录 我探索了各种选择,找到了杰克逊。我对1000个样本对象进行了循环和反序列化的快速测试。杰克逊好像快了3-5倍 现在,我构建了一个可以在库之间切换的包装器,并开始测试,同时并排查看从每个库中获得的内容。这是我的密码: public static <T> T fromJson(String json, Class<T> classOfT) throws

在我的应用程序中——我使用JSON进行序列化,到目前为止——我使用的是GSON。好吧,这有点慢,尤其是我加载对象的初始登录

我探索了各种选择,找到了杰克逊。我对1000个样本对象进行了循环和反序列化的快速测试。杰克逊好像快了3-5倍

现在,我构建了一个可以在库之间切换的包装器,并开始测试,同时并排查看从每个库中获得的内容。这是我的密码:

public static <T> T fromJson(String json, Class<T> classOfT) throws Exception
    {
        T returnObject;

        Long milliseconds = (new Date()).getTime();
        returnObject = MyGsonWrapper.getMyGson().fromJson(json, classOfT);
        Long gsonTime = (new Date()).getTime() - milliseconds;

        milliseconds = (new Date()).getTime();
        returnObject = MyJacksonWrapper.getMyJson().readValue(json, classOfT);
        Long jacksonTime = (new Date()).getTime() - milliseconds;

if (gsonTime < jacksonTime)
        {
            Log.d(LOG_TAG, "------------- GSON Wins by " + Long.toString(jacksonTime - gsonTime) + " object: " + classOfT.getName());
        }
        else
        {
            Log.d(LOG_TAG, "------------- Jackson Wins by " + Long.toString(gsonTime - jacksonTime) + " object: " + classOfT.getName());
        }

要尝试并规范化由于VM动态行为以及热/冷JVM造成的差异,请尝试对每个循环运行10000次计时,然后查看差异

还请注意,第一组代码运行的时间与第二组代码运行的时间不同,这仅仅是由于VM的随机性;所以,把这些都翻过来,然后平均时间

Net,我怀疑你会发现有什么显著的区别

旁白:如果毫秒有很大的不同,那么看看Jackson和GSON都提供的流解析,它们可以提供更快的原始访问(但你将负责解析逻辑和重建对象,这可能是一个净损失)

这里通常有一些警告(如果是新的,谷歌可以提供Java性能测量的提示):

  • 您必须运行足够的度量来稳定计时结果——JVM需要一段时间来优化代码(从字节码编译为本机代码)。这意味着在进行任何测量前至少10秒左右
  • 不要传递字符串,除非您的输入必须是字符串——读取输入的开销,转换为字符串通常是不必要的,最快的方法是传入
    InputStream
    byte[]”(或者,对于两者都不接受的解析器,从
    InputStream构建的
    Reader
    )`
  • (次要)不要构造
    Date
    s;只需使用
    System.currentTimeMillis()
    (或“timeNanos”)获取计时

我的猜测是,您可能忘记了第一部分,因此结果有点随意,在不同的运行中会发生变化。

如果我可以添加,如果毫秒产生差异,请查看不同的序列化协议。非常好的答案,我唯一要添加的是在实际设备上测试数字,而不仅仅是在仿真器中测试数字在某些情况下会出现极端的差异。事实上,这是我的愚蠢…所有的缓慢都来自于向数据库(SQLite)写入数据,而不是序列化。在做了适当的跟踪日志之后,我认为JSON解析从一开始就不是一个问题…Katit,很高兴你找到了罪魁祸首。
02-17 10:23:26.068: DEBUG/com.idatt.json.JsonWrapper(12004): ------------- GSON Wins by 108 object: [Lcom.idatt.json.UserPreference;
02-17 10:23:28.006: DEBUG/com.idatt.json.JsonWrapper(12004): ------------- Jackson Wins by 34 object: [Lcom.idatt.json.MailTemplate;
02-17 10:23:29.154: DEBUG/com.idatt.json.JsonWrapper(12004): ------------- GSON Wins by 27 object: [Lcom.idatt.json.MailItem;
02-17 10:23:36.514: DEBUG/com.idatt.json.JsonWrapper(12004): ------------- Jackson Wins by 599 object: [Lcom.idatt.json.TripUser;
02-17 10:23:50.260: DEBUG/com.idatt.json.JsonWrapper(12004): ------------- Jackson Wins by 1 object: [Lcom.idatt.json.TripUpdate;
02-17 10:24:00.455: DEBUG/com.idatt.json.JsonWrapper(12004): ------------- GSON Wins by 45 object: java.lang.Integer
02-17 10:24:00.541: DEBUG/com.idatt.json.JsonWrapper(12004): ------------- GSON Wins by 34 object: [Lcom.idatt.json.Device;