在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

幾種toString的性能對比

Android編程精選 ? 來源:Android編程精選 ? 作者:Android編程精選 ? 2022-10-11 10:59 ? 次閱讀

簡介

誰在乎toString的性能?沒有人!

除非你批量處理大量數(shù)據(jù),追求算法高性能,否則將使用toString進(jìn)行大量日常類型轉(zhuǎn)換。然后,你會研究為什么它很慢,認(rèn)識到toString()主要是使用內(nèi)部實(shí)現(xiàn)的并且可以優(yōu)化。

首先,讓我們看一下Javadoc的描述 Object.toString 應(yīng)該做什么:“ 返回對象的字符串表示形式。通常,該 toString方法返回一個“以文本形式表示”此對象的字符串。結(jié)果應(yīng)該是簡潔易懂的表示形式,便于人們閱讀。建議所有子類都重寫此方法?!?。IDE(idea、eclipse)往往會為我們生成equals 、 hashcode 、 toString方法的重寫……我們通常會這樣。此外,IDE為我們提供了幾種選擇來生成toString:String級聯(lián)(使用+符號),StringBuffer,StringBuilder,ToStringBuilder,ReflectionToStringBuilder,Guava或Objects.toString ...

在這些實(shí)現(xiàn)方案中,你會選擇哪一個?

如果你想知道哪種實(shí)現(xiàn)更有效,我們可以通過JMH測試基準(zhǔn)來看看效果。

對于此基準(zhǔn)測試,我創(chuàng)建了類(使用繼承,集合等),并且使用了idea生成的所有不同的toString實(shí)現(xiàn),以查看哪個性能更高。代碼盡量簡潔,無論使用哪種技術(shù)(見下文),為一些屬性或所有屬性(包括繼承,依賴關(guān)系和集合)生成toString都會對性能產(chǎn)生巨大影響。

+符號

讓我們從性能最高的方法開始:帶+符號的字符串連接。很多人告訴我們不要使用+號來生成字符串,這種寫法不友善,尤其在JVM7之前。但是,Java Compiler會 將+符號編譯為字符串生成器(大多數(shù)情況下),做了很多的優(yōu)化。所以,不要猶豫,使用它。但是它唯一的缺點(diǎn)是不處理null值,你需要自己做特殊處理。

在以下結(jié)果中是JMH的平均性能:

    public String toString() {
     return "MyObject{" +
     "att1='" + att1 + ''' +
     ", att2='" + att2 + ''' +
     ", att3='" + att3 + ''' +
     "} " + super.toString();
    }
     
    // Average performance with JMH (ops/s)
    // (min, avg, max) = (140772,314, 142075,167, 143844,717)

Objects.toString

Java SE 7帶來了Objects類以及一些靜態(tài)方法。Objects.toString的優(yōu)點(diǎn)是它處理null值,如果為null,甚至可以設(shè)置默認(rèn)值。性能比之前的代碼略低,但是會處理null:

    public String toString() {
     return "MyObject{" +
     "att1='" + Objects.toString(att1) + ''' +
     ", att2='" + Objects.toString(att2) + ''' +
     ", att3='" + Objects.toString(att3) + ''' +
     "} " + super.toString();
    }
     
    // Average performance with JMH (ops/s)
    // (min, avg, max) = (138790,233, 140791,365, 142031,847)

StringBuilder

另一種實(shí)現(xiàn)方案是使用StringBuilder。在這里,很難分辨出哪種技術(shù)表現(xiàn)更好。后三種技術(shù)在性能方面非常相似。

    public String toString() {
     final StringBuilder sb = new StringBuilder("MyObject{");
     sb.append("att1='").append(att1).append(''');
     sb.append(", att2='").append(att2).append(''');
     sb.append(", att3='").append(att3).append(''');
     sb.append(super.toString());
     return sb.toString();
    }
    
    // Average performance with JMH (ops/s)
    // (min, avg, max) = (96073,645, 141463,438, 146205,910)

Guava

Guava幾乎沒有幫助器類:其中之一可以幫助您生成toString。它的性能不如純JDK API,但guava可以為你提供一些額外的服務(wù)

    public String toString() {
     return Objects.toStringHelper(this)
     .add("att1", att1)
     .add("att2", att2)
     .add("att3", att3)
     .add("super", super.toString()).toString();
    }
     
    // Average performance with JMH (ops/s)
    // (min, avg, max) = (97049,043, 110111,808, 114878,137)

Commons Lang3

Commons Lang3有幾種生成toString的技術(shù):從生成器到內(nèi)部檢查器。如你所看的結(jié)果,內(nèi)部更易于使用,代碼行更少,但會對性能造成嚴(yán)重影響:

    public String toString() {
     return new ToStringBuilder(this)
     .append("att1", att1)
     .append("att2", att2)
     .append("att3", att3)
     .append("super", super.toString()).toString();
    }
     
    // Average performance with JMH (ops/s)
    // (min, avg, max) = ( 73510,509, 75165,552, 76406,370)
    public String toString() {
     return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
     
    // Average performance with JMH (ops/s)
    // (min, avg, max) = (31803,224, 34930,630, 35581,488)
    public String toString() {
     return ReflectionToStringBuilder.toString(this);
    }
     
    // Average performance with JMH (ops/s)
    // (min, avg, max) = (14172,485, 23204,479, 30754,901)

結(jié)論

如今,隨著JVM的優(yōu)化, 我們可以安全地使用+符號來連接字符串(并使用Objects.toString來處理空值)。 使用JDK內(nèi)置的實(shí)用程序類 Objects,無需外部框架即可處理空值。因此,開箱即用的JDK具有比本文介紹的任何其他技術(shù)更好的性能(如果你有其他框架/技術(shù),請留言給我,我會嘗試一下,歡迎交流)。

總結(jié)一下,這是一張表,其中包含JMH的平均表現(xiàn) (從表現(xiàn)最好的到表現(xiàn)欠佳的):

4bdd281a-4286-11ed-96c9-dac502259ad0.png202209222331368601.png

JMH結(jié)果

同樣,如果你經(jīng)常調(diào)用toString方法,那么所有這些都很重要。如果沒有,性能并不是真正的問題,用那個都可以,怎么方便怎么來。

拓展

針對+號拼接

    package tostring;
    
    public class Main {
    
     public static void main(String[] args) {
     int n = 1000, iterations = 10000;
     long len, t0, t1;
     
     // string builder: < 1 second
     len = 0;
     t0 = System.currentTimeMillis();
     for (int j = 0; j < iterations; j++) {
     StringBuilder builder = new StringBuilder();
     for (int i = 0; i < n; i++) {
     builder.append(i);
     }
     len += builder.toString().length();
     }
     t1 = System.currentTimeMillis();
     System.out.println(len + " " + (t1 - t0));
    
     // string concatenation: 10 seconds
     len = 0;
     t0 = System.currentTimeMillis();
     for (int j = 0; j < iterations; j++) {
     String res = "";
     for (int i = 0; i < n; i++) {
     res += i;
     }
     len += res.length();
     }
     t1 = System.currentTimeMillis();
     System.out.println(len + " " + (t1 - t0));
     }
    
    }

請注意字符串連接,因?yàn)镴VM不夠聰明,無法優(yōu)化復(fù)雜的流。一個簡單的循環(huán)會使性能受到很大的影響,這也就是為什么JDK強(qiáng)調(diào)“簡潔”非常重要。你應(yīng)該避免循環(huán)使用toString方法。

+的String concat與String builder有可能有同樣的性能

奇怪的是,帶有+的String concat與String builder花費(fèi)幾乎相同的時(shí)間

這個其中的原因就是編譯器做了一些優(yōu)化產(chǎn)生的,編譯時(shí),javac用StringBuilder替換串聯(lián)。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2984

    瀏覽量

    106725
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    589

    瀏覽量

    21061
  • string
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    4860

原文標(biāo)題:+的String concat與String builder有可能有同樣的性能

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Nanopi系列板子資源性能對比

    Nanopi系列板子資源性能對比對比性能 選擇適合你的板子
    發(fā)表于 08-05 14:21

    SparkRDMA基于BigDataBench的性能對比測試

    SparkRDMA基于BigDataBench 性能對比測試
    發(fā)表于 05-04 13:16

    Linux下AWTK與Qt的性能對比

    為了比較直觀的看到AWTK的基本性能,我們對產(chǎn)品開發(fā)者比較關(guān)心GUI的一些參數(shù)做了測試,如界面刷新幀數(shù)、啟動時(shí)間等。讓我們從參數(shù)上直觀了解Linux下AWTK與Qt的性能對比。
    發(fā)表于 10-29 08:26

    藍(lán)牙與低功耗藍(lán)牙芯片功能性能對比分析

    經(jīng)典藍(lán)牙與低功耗藍(lán)牙芯片功能性能對比
    發(fā)表于 12-28 07:55

    Arm Cortex-A35性能對比分析

    Arm Cortex-A35性能對比
    發(fā)表于 01-19 07:44

    主流CAN收發(fā)器性能對比分析哪個最好?

    主流CAN收發(fā)器性能對比分析哪個最好?
    發(fā)表于 05-20 06:14

    步進(jìn)電機(jī)和交流伺服電機(jī)性能對比分析哪個好?

    步進(jìn)電機(jī)和交流伺服電機(jī)性能對比分析哪個好?
    發(fā)表于 10-09 06:03

    工頻機(jī)和高頻機(jī)的性能對比分析哪個好?

    工頻機(jī)和高頻機(jī)的原理是什么?工頻機(jī)和高頻機(jī)的性能對比分析哪個好?
    發(fā)表于 10-21 06:08

    常用無線收發(fā)芯片性能對比分析哪個好?

    常用無線收發(fā)芯片性能對比分析哪個好?選擇收發(fā)芯片時(shí)有哪些注意事項(xiàng)?
    發(fā)表于 10-21 06:14

    步進(jìn)電機(jī)和交流伺服電機(jī)性能對比分析哪個好?

    步進(jìn)電機(jī)和交流伺服電機(jī)性能對比分析哪個好?
    發(fā)表于 11-15 07:25

    談?wù)凷T的單片機(jī)分類及性能對比

    ,轉(zhuǎn)載請注明.文章目錄前言一、ST的單片機(jī)分類二、ST性能對比總結(jié)前言最近,由于新項(xiàng)目即將開始,我在選型的時(shí)候,突然想到早些年的一個面試。當(dāng)時(shí)面試的時(shí)候,我說了兩個項(xiàng)目。兩個用到了不同的MCU
    發(fā)表于 12-09 06:10

    arduino和stm32性能對比究竟誰更厲害?

    一些DIY和各種小項(xiàng)目?arduino和stm32性能對比究竟誰更厲害呢?我們一起來討論一下。比較兩者之前首先我們來了解下arduino和stm32的特點(diǎn):Arduino:Arduino UNO-DFRobot商城1. Arduino更傾向于創(chuàng)意,它弱化了具體的硬件的操作,它的函數(shù)...
    發(fā)表于 01-24 07:14

    關(guān)于STM32各系列MCU性能對比及測試說明

    STM32各系列MCU性能對比及測試說明
    的頭像 發(fā)表于 03-04 10:20 ?1.4w次閱讀

    高頻型直流充電機(jī)性能對比檢驗(yàn)試驗(yàn)總結(jié)報(bào)告

    高頻型直流充電機(jī)性能對比檢驗(yàn)試驗(yàn)總結(jié)報(bào)告(開關(guān)電源技術(shù)課程設(shè)計(jì))-高頻型直流充電機(jī)性能對比檢驗(yàn)試驗(yàn)總結(jié)報(bào)告? ? ? ? ? ?
    發(fā)表于 08-31 19:55 ?19次下載
    高頻型直流充電機(jī)<b class='flag-5'>性能對比</b>檢驗(yàn)試驗(yàn)總結(jié)報(bào)告

    ICL5101與ICL5102性能對比

    ICL5101與ICL5102性能對比-中文
    發(fā)表于 06-17 14:26 ?1次下載
    主站蜘蛛池模板: 国产一级一片免费播放视频 | 一本大道一卡二卡 | 国产夜夜爽 | 免费大片黄日本在线观看 | 亚洲欧美综合一区二区三区四区 | 欧美zooz人禽交免费 | 久久久久国产精品免费网站 | 看黄视频网站 | 一级免费黄色片 | 久久综合综合久久 | 国产二三区 | 五月激情六月 | 8050午夜一级| 黄频免费 | 日本三级日产三级国产三级 | 国产精品成人一区二区三区 | 色99视频| 午夜刺激爽爽视频免费观看 | 老司机狠狠k免费毛片 | 5x性区m免费毛片视频看看 | 日韩免费观看一级毛片看看 | 国产精品久久久久乳精品爆 | 国产激爽大片在线播放 | 97综合久久 | 天天操夜夜爽 | 五月天福利视频 | 黄频网| 日韩a级毛片免费观看 | 你懂的手机在线观看 | 午夜福利国产一级毛片 | 天堂bt种子资源地址在线 | 看全色黄大色大片免费久久 | 九九九精品午夜在线观看 | 国产精品久久久久久久人热 | 狠狠一区 | 日韩三级免费看 | 欧美一区二区三区不卡免费观看 | 天堂网在线资源 | 中文字幕色网站 | 中文字幕首页 | 欧美性白人极品1819hd |