簡體   English   中英

為什么傑克遜這么慢?

[英]Why Jackson is so slow?

我使用簡單的 Jackson 代碼從我的對象轉換為 json 字符串,但它真的很慢。 在我的機器中只轉換一個對象需要 70 毫秒。 我做了什么嗎?

ObjectMapper myObjectMapper = new ObjectMapper();
void testJson()
{

    MyClass state = new MyClass();
    try
    {
        String result = myObjectMapper.writeValueAsString(state);
    } catch (Exception ex)
    {

    }

}

MyClass 只有 4 名成員

 MyClass
    {
    public int a;
        public  int b;
        public int c;
        public String d;
    }

我使用簡單的 Jackson 代碼從我的對象轉換為 json 字符串,但它真的很慢。 在我的機器中只轉換一個對象需要 70 毫秒。 我做了什么嗎?

70 毫秒來編碼和發送 JSON 消息是難以置信的。 毫無疑問,真正的解釋是 70 毫秒的測量是您對代碼進行基准測試的方式的產物。 可能,您沒有考慮 JVM 預熱效果。

所以,是的,你做的基准測試不正確。 大概。

現在我找到了通過網絡發送MyClass的實例的三種解決方案: 1:使用Jackson轉換為byte[]並發送。 2:使用內置序列化轉換成byte[]並發送。 3:將MyClass的成員轉成String,再轉成byte[]發送。 還有其他更好的解決方案嗎?

理論上(即,如果您有足夠的技巧、時間和耐心)可以通過手動將數據編碼到字節緩沖區並發送它來實現最佳性能。 但這只是理論上的。

如果您正在尋找可能比您嘗試過的替代方案更快的實用解決方案,請查看Google Protocol Buffers 他們被認為是快速...


一個對象70毫秒,但是當我嘗試1000個對象時,只需要114毫秒,是不是很奇怪?

實際上,考慮到 JVM 的工作方式,這並不奇怪。

當 JVM 啟動時,它會加載您的代碼並開始使用字節碼解釋器運行它。 在對代碼進行一點解釋之后,JVM 運行 JIT 編譯器,為頻繁調用的方法生成優化的本機代碼。 此編譯過程需要大量時間。

因此,當您測量發送一個對象所花費的時間時,您可能實際上是在測量發送一個對象的時間並進行大量 JIT 編譯。 但是不需要重復 JIT 編譯工作。 最終結果 - 與 1000 個相比,處理一個對象似乎需要很長時間。

JIT 編譯是常見的 JVM 預熱效果之一,它會扭曲編寫不佳的 Java 基准測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM