zoukankan      html  css  js  c++  java
  • highcharts 大数据 String+,StringBuilder,String.format运行效率比较

    实现String字符串相加的方法有很多,常见的有直接相加,StringBuilder.append和String.format,这三者的运行效率是有差异的,String是final类型的,每次相加都会new一个

    新的String对象,如果这种操作很多的话,很占用很大的内存。而StringBuilder.append方法是在原对象上进行操作,如果长度不够就自行扩展。

    测试代码1:

     
    1. <span style="white-space:pre">    </span>String success_code = "0"; 
    2.      
    3.     byte splite = 0x01; 
    4.      
    5.     private void method1(){ 
    6.         String resultMsg = ""; 
    7.         long time1 = System.nanoTime(); 
    8.         String.format("ErrorCode=%s%cErrorMsg=心跳包接收成功%c", success_code, splite, splite); 
    9.         long time2 = System.nanoTime(); 
    10.         System.out.println("StringFormat:"+(time2-time1)+"ns"); 
    11.          
    12.         long time3 = System.nanoTime(); 
    13.         resultMsg = "ErrorCode="+success_code+splite+"ErrorMsg=心跳包接收成功"+splite; 
    14.         long time4 = System.nanoTime(); 
    15.         System.out.println("String add:"+(time4-time3)+"ns"); 
    16.          
    17.         long time5 = System.nanoTime(); 
    18.         sb.append("ErrorCode=").append(success_code).append(splite).append("ErrorMsg=心跳包接收成功").append(splite); 
    19.         long time6 = System.nanoTime(); 
    20.         System.out.println("StringBuilder add:"+(time6-time5)+"ns"); 
    21.         System.out.println("-------------------------------------------------"); 
    22.     } 
    23.      
    24.     @Test 
    25.     public void test1(){ 
    26.         for(int i=0; i<1000; i++){ 
    27.             method1(); 
    28.         } 
    29.     } 
    <span style="white-space:pre">	</span>String success_code = "0";
    	
    	byte splite = 0x01;
    	
    	private void method1(){
    		String resultMsg = "";
    		long time1 = System.nanoTime();
    		String.format("ErrorCode=%s%cErrorMsg=心跳包接收成功%c", success_code, splite, splite);
    		long time2 = System.nanoTime();
    		System.out.println("StringFormat:"+(time2-time1)+"ns");
    		
    		long time3 = System.nanoTime();
    		resultMsg = "ErrorCode="+success_code+splite+"ErrorMsg=心跳包接收成功"+splite;
    		long time4 = System.nanoTime();
    		System.out.println("String add:"+(time4-time3)+"ns");
    		
    		long time5 = System.nanoTime();
    		sb.append("ErrorCode=").append(success_code).append(splite).append("ErrorMsg=心跳包接收成功").append(splite);
    		long time6 = System.nanoTime();
    		System.out.println("StringBuilder add:"+(time6-time5)+"ns");
    		System.out.println("-------------------------------------------------");
    	}
    	
    	@Test
    	public void test1(){
    		for(int i=0; i<1000; i++){
    			method1();
    		}
    	}

    运行结果:

     
    1. StringFormat:58025ns 
    2. String add:3158ns 
    3. StringBuilder add:1579ns 
    4. ------------------------------------------------- 
    5. StringFormat:43026ns 
    6. String add:3948ns 
    7. StringBuilder add:1974ns 
    8. ------------------------------------------------- 
    9. ..... 
    10. StringFormat:46973ns 
    11. String add:1579ns 
    12. StringBuilder add:790ns 
    13. ------------------------------------------------- 
    14. StringFormat:52499ns 
    15. String add:1578ns 
    16. StringBuilder add:790ns 
    17. ------------------------------------------------- 
    18. StringFormat:43026ns 
    19. String add:1579ns 
    20. StringBuilder add:790ns 
    21. ------------------------------------------------- 
    StringFormat:58025ns
    String add:3158ns
    StringBuilder add:1579ns
    -------------------------------------------------
    StringFormat:43026ns
    String add:3948ns
    StringBuilder add:1974ns
    -------------------------------------------------
    .....
    StringFormat:46973ns
    String add:1579ns
    StringBuilder add:790ns
    -------------------------------------------------
    StringFormat:52499ns
    String add:1578ns
    StringBuilder add:790ns
    -------------------------------------------------
    StringFormat:43026ns
    String add:1579ns
    StringBuilder add:790ns
    -------------------------------------------------
    

    从上述结果可知,StringBuilder与String直接相加的执行效率都比String.format高, 而StringBuilder的执行效率要比String直接相加要高点。下面针对String,StringBuilder再

    做一组测试。

    测试代码2:

     
    1. <span style="white-space:pre">    </span>public void method2(int num){ 
    2.         String text = ""; 
    3.         long beginTime = System.nanoTime(); 
    4.         for(int i = 0; i < num; i++){ 
    5.                 text += i; 
    6.             } 
    7.         long endTime = System.nanoTime(); 
    8.         System.out.println("String直接相加"+num+"次耗费时间:" + (endTime - beginTime)+"ns"); 
    9.         StringBuilder builder = new StringBuilder(""); 
    10.         beginTime = System.nanoTime(); 
    11.         for(int i = 0; i < num; i++){ 
    12.                 builder.append(i); 
    13.             } 
    14.         endTime = System.nanoTime(); 
    15.         System.out.println("StringBuilder相加"+num+"次耗费时间:" + (endTime - beginTime)+"ns"); 
    16.         System.out.println("---------------------------------------------------"); 
    17.     } 
    18.      
    19.     @Test 
    20.     public void test2(){ 
    21.         method2(10); 
    22.         method2(100); 
    23.         method2(10000); 
    24.         method2(100000); 
    25.     } 
    <span style="white-space:pre">	</span>public void method2(int num){
    		String text = "";
    		long beginTime = System.nanoTime();
    		for(int i = 0; i < num; i++){
    				text += i;
    			}
    		long endTime = System.nanoTime();
    		System.out.println("String直接相加"+num+"次耗费时间:" + (endTime - beginTime)+"ns");
    		StringBuilder builder = new StringBuilder("");
    		beginTime = System.nanoTime();
    		for(int i = 0; i < num; i++){
    				builder.append(i);
    			}
    		endTime = System.nanoTime();
    		System.out.println("StringBuilder相加"+num+"次耗费时间:" + (endTime - beginTime)+"ns");
    		System.out.println("---------------------------------------------------");
    	}
    	
    	@Test
    	public void test2(){
    		method2(10);
    		method2(100);
    		method2(10000);
    		method2(100000);
    	}

    运行结果:

     
    1. String直接相加10次耗费时间:19737ns 
    2. StringBuilder相加10次耗费时间:3553ns 
    3. --------------------------------------------------- 
    4. String直接相加100次耗费时间:56447ns 
    5. StringBuilder相加100次耗费时间:47762ns 
    6. --------------------------------------------------- 
    7. String直接相加10000次耗费时间:266082677ns 
    8. StringBuilder相加10000次耗费时间:999061ns 
    9. --------------------------------------------------- 
    10. String直接相加100000次耗费时间:45212528095ns 
    11. StringBuilder相加100000次耗费时间:3040604ns 
    12. --------------------------------------------------- 
    String直接相加10次耗费时间:19737ns
    StringBuilder相加10次耗费时间:3553ns
    ---------------------------------------------------
    String直接相加100次耗费时间:56447ns
    StringBuilder相加100次耗费时间:47762ns
    ---------------------------------------------------
    String直接相加10000次耗费时间:266082677ns
    StringBuilder相加10000次耗费时间:999061ns
    ---------------------------------------------------
    String直接相加100000次耗费时间:45212528095ns
    StringBuilder相加100000次耗费时间:3040604ns
    ---------------------------------------------------

    从测试结果可分析出,StringBuilder的效率是比String高。

    再来看一个测试,代码和上面的一样,只是SringBuilder加上个toString

    测试代码:

     
    1. String success_code = "0"; 
    2.      
    3.     byte splite = 0x01; 
    4.      
    5.     private void method1(){ 
    6.         String resultMsg = ""; 
    7.         long time1 = System.nanoTime(); 
    8.         resultMsg = String.format("ErrorCode=%s%cErrorMsg=心跳包接收成功%c", success_code, splite, splite); 
    9.         long time2 = System.nanoTime(); 
    10.         System.out.println("StringFormat:"+(time2-time1)+"ns"); 
    11.          
    12.         long time3 = System.nanoTime(); 
    13.         resultMsg = "ErrorCode="+success_code+splite+"ErrorMsg=心跳包接收成功"+splite; 
    14.         long time4 = System.nanoTime(); 
    15.         System.out.println("String add:"+(time4-time3)+"ns"); 
    16.          
    17.         long time5 = System.nanoTime(); 
    18.         resultMsg = sb.append("ErrorCode=").append(success_code).append(splite).append("ErrorMsg=心跳包接收成功").append(splite).toString(); 
    19.         long time6 = System.nanoTime(); 
    20.         System.out.println("StringBuilder add:"+(time6-time5)+"ns"); 
    21.         System.out.println("-------------------------------------------------"); 
    22.     } 
    String success_code = "0";
    	
    	byte splite = 0x01;
    	
    	private void method1(){
    		String resultMsg = "";
    		long time1 = System.nanoTime();
    		resultMsg = String.format("ErrorCode=%s%cErrorMsg=心跳包接收成功%c", success_code, splite, splite);
    		long time2 = System.nanoTime();
    		System.out.println("StringFormat:"+(time2-time1)+"ns");
    		
    		long time3 = System.nanoTime();
    		resultMsg = "ErrorCode="+success_code+splite+"ErrorMsg=心跳包接收成功"+splite;
    		long time4 = System.nanoTime();
    		System.out.println("String add:"+(time4-time3)+"ns");
    		
    		long time5 = System.nanoTime();
    		resultMsg = sb.append("ErrorCode=").append(success_code).append(splite).append("ErrorMsg=心跳包接收成功").append(splite).toString();
    		long time6 = System.nanoTime();
    		System.out.println("StringBuilder add:"+(time6-time5)+"ns");
    		System.out.println("-------------------------------------------------");
    	}
    1. <span style="white-space:pre">    </span>@Test 
    2.     public void test1(){ 
    3.         for(int i=0; i<10; i++){ 
    4.             method1(); 
    5.         } 
    6.     } 
    <span style="white-space:pre">	</span>@Test
    	public void test1(){
    		for(int i=0; i<10; i++){
    			method1();
    		}
    	}

    运行结果:

     
    1. StringFormat:564859ns 
    2. String add:55657ns 
    3. StringBuilder add:3158ns 
    4. ------------------------------------------------- 
    5. StringFormat:98683ns 
    6. String add:2368ns 
    7. StringBuilder add:1974ns 
    8. ------------------------------------------------- 
    9. StringFormat:69867ns 
    10. String add:2369ns 
    11. StringBuilder add:1974ns 
    12. ------------------------------------------------- 
    13. StringFormat:77762ns 
    14. String add:3552ns 
    15. StringBuilder add:2369ns 
    16. ------------------------------------------------- 
    17. StringFormat:105788ns 
    18. String add:3948ns 
    19. StringBuilder add:2368ns 
    20. ------------------------------------------------- 
    21. StringFormat:78552ns 
    22. String add:2763ns 
    23. StringBuilder add:1974ns 
    24. ------------------------------------------------- 
    25. StringFormat:68683ns 
    26. String add:2368ns 
    27. StringBuilder add:1974ns 
    28. ------------------------------------------------- 
    29. StringFormat:67894ns 
    30. String add:2369ns 
    31. StringBuilder add:1973ns 
    32. ------------------------------------------------- 
    33. StringFormat:67499ns 
    34. String add:2369ns 
    35. StringBuilder add:1974ns 
    36. ------------------------------------------------- 
    37. StringFormat:116840ns 
    38. String add:3948ns 
    39. StringBuilder add:3552ns 
    40. ------------------------------------------------- 
    StringFormat:564859ns
    String add:55657ns
    StringBuilder add:3158ns
    -------------------------------------------------
    StringFormat:98683ns
    String add:2368ns
    StringBuilder add:1974ns
    -------------------------------------------------
    StringFormat:69867ns
    String add:2369ns
    StringBuilder add:1974ns
    -------------------------------------------------
    StringFormat:77762ns
    String add:3552ns
    StringBuilder add:2369ns
    -------------------------------------------------
    StringFormat:105788ns
    String add:3948ns
    StringBuilder add:2368ns
    -------------------------------------------------
    StringFormat:78552ns
    String add:2763ns
    StringBuilder add:1974ns
    -------------------------------------------------
    StringFormat:68683ns
    String add:2368ns
    StringBuilder add:1974ns
    -------------------------------------------------
    StringFormat:67894ns
    String add:2369ns
    StringBuilder add:1973ns
    -------------------------------------------------
    StringFormat:67499ns
    String add:2369ns
    StringBuilder add:1974ns
    -------------------------------------------------
    StringFormat:116840ns
    String add:3948ns
    StringBuilder add:3552ns
    -------------------------------------------------

    当运行10次时,均显示StringBuilder.append.toString的效率比String的直接相加高。

    测试执行10000次,结果如下:

     
    1. StringFormat:9079ns 
    2. String add:789ns 
    3. StringBuilder add:153550ns 
    4. ------------------------------------------------- 
    5. StringFormat:18552ns 
    6. String add:789ns 
    7. StringBuilder add:141708ns 
    8. ------------------------------------------------- 
    9. StringFormat:9078ns 
    10. String add:395ns 
    11. StringBuilder add:122761ns 
    12. ------------------------------------------------- 
    StringFormat:9079ns
    String add:789ns
    StringBuilder add:153550ns
    -------------------------------------------------
    StringFormat:18552ns
    String add:789ns
    StringBuilder add:141708ns
    -------------------------------------------------
    StringFormat:9078ns
    String add:395ns
    StringBuilder add:122761ns
    -------------------------------------------------
     
  • 相关阅读:
    NYOJ47 过河问题
    CodeForces1165
    LuoGuP3667
    ZROI#958
    ZROI#957
    KMP小结
    LuoGuP2742[模板]二维凸包
    ZROI#999
    ZROI#997
    ZROI#996
  • 原文地址:https://www.cnblogs.com/aflyfly/p/6494943.html
Copyright © 2011-2022 走看看