c# 字符串操作的性能測試 未知編碼 byte[] 轉 string

這個測試包含

1、while for 循環語句的測試;
2、StringBuilder 追加字符方法的測試;
       Insert 和 Append
3、byte的相關方法;
      BitConverter類byte[] 轉換的集合,

using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
namespace aMao.Common
{
    
class Program
    {
        
static void Main(string[] args)
        {
            StringBuilder sb
=new StringBuilder();
            
int m=0;
            
//控制字節長度
            while (m++<1)
            {
                sb.AppendFormat(
"當前時間");
            }
            
//被測方法循環次數
            int n=200000;
            
string t="";
            
byte[] bs=System.Text.Encoding.Default.GetBytes(sb.ToString());
            
//byte本身的toString()方法 
            DateTime tm=DateTime.Now;
            
for (int j=0; j<n; j++)
            {
                t
=byteToString(bs);
            }
            Console.WriteLine(
"byteToString "+((DateTime)DateTime.Now-tm).TotalMilliseconds);
            Console.WriteLine(t);
            
//遍歷添加到stringbuilder for insert
            tm=DateTime.Now;
            
for (int j=0; j<n; j++)
            {
                t
=byteTostring_for_insert(bs);
            }
            Console.WriteLine(
"byteTostring_for_insert HEX_TABLE "+((DateTime)DateTime.Now-tm).TotalMilliseconds);
            Console.WriteLine(t);
            
//遍歷添加到stringbuilder while append 
            tm=DateTime.Now;
            
for (int j=0; j<n; j++)
            {
                t
=byteTostring_while_Append(bs);
            }
            Console.WriteLine(
"byteTostring_while_Append HEX_TABLE "+((DateTime)DateTime.Now-tm).TotalMilliseconds);
            Console.WriteLine(t);
            
//遍歷添加到stringbuilder for append 
            tm=DateTime.Now;
            
for (int j=0; j<n; j++)
            {
                t
=byteTostring_for_Append(bs);
            }
            Console.WriteLine(
"byteTostring_for_Append HEX_TABLE "+((DateTime)DateTime.Now-tm).TotalMilliseconds);
            Console.WriteLine(t);
            
//直接使用自帶BitConverter 
            tm=DateTime.Now;
            
for (int j=0; j<n; j++)
            {
                t
=BitConverter.ToString(bs);
            }
            Console.WriteLine(
"BitConverter "+((DateTime)DateTime.Now-tm).TotalMilliseconds);
            Console.WriteLine(t);
            
/*******測試while 和 for**********/
            tm
=DateTime.Now;
            whileRun(n 
* n);
            Console.WriteLine(
"whileRun  "+((DateTime)DateTime.Now-tm).TotalMilliseconds);
            tm
=DateTime.Now;
            forRun(n 
* n);
            Console.WriteLine(
"forRun "+((DateTime)DateTime.Now-tm).TotalMilliseconds);
            tm
=DateTime.Now;
            
/*****************/
            Console.ReadLine();
        }
        
const string HEX_TABLE="0123456789abcdef";
        
// static char[] HEX_TABLE="0123456789abcdef".ToCharArray();
        public static string byteTostring_for_Append(byte[] b)
        {
            StringBuilder sb
=new StringBuilder();
            
int n=b.Length;
            
int tmp;
            
for (int i=0; i<n; i++)
            {
                tmp
=b[i];
                sb.Append(HEX_TABLE[tmp
>>4]);
                sb.Append(HEX_TABLE[tmp
&0xf]);
            }
            
return sb.ToString();
        }
        
public static string byteTostring_while_Append(byte[] b)
        {
            StringBuilder sb
=new StringBuilder();
            
int n=b.Length;
            
int tmp;
            
/***/
            
int i=0;
            
while (i<n)
            {
                tmp
=b[i];
                sb.Append(HEX_TABLE[tmp
>>4]);
                sb.Append(HEX_TABLE[tmp
&0xf]);
                i
++;
            }
            
/***/
            
return sb.ToString();
        }
        
public static string byteTostring_for_insert(byte[] b)
        {
            StringBuilder sb
=new StringBuilder();
            
int n=b.Length;
            
int tmp;
            
int idx=0;
            
for (int i=0; i<n; i++)
            {
                tmp
=b[i];
                sb.Insert(idx
++, HEX_TABLE[tmp>>4]);
                sb.Insert(idx
++, HEX_TABLE[tmp&0xf]);
            }
            
return sb.ToString();
        }
        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="b"></param>
        
/// <returns></returns>
        public static string byteToString(byte[] b)
        {
            StringBuilder sb
=new StringBuilder();
            
int n=b.Length;
            
for (int i=0; i<n; i++)
            {
                sb.Append(b[i].ToString(
"x").PadLeft(2'0'));
            }
            
return sb.ToString();
        }
        
public static string byteTostring(byte[] b, byte bt_key)
        {
            StringBuilder sb
=new StringBuilder();
            
int n=b.Length;
            
int tmp;
            
int idx=0;
            
for (int i=0; i<n; i++)
            {
                tmp
=(b[i]^bt_key);
                sb.Insert(idx
++, HEX_TABLE[tmp>>4]);
                sb.Insert(idx
++, HEX_TABLE[tmp&0xf]);
            }
            
return sb.ToString();
        }
        
public static void whileRun(int n)
        {
            
int i=0;
            
while (i<n)
            {
                i
++;
            }
        }
        
public static void forRun(int n)
        {
            
for (int i=0; i<n; i++)
            {
            }
        }
        
public static bool ValidateRight(int iAllRight, int iCurrRight)
        {
            
if (iAllRight==(iAllRight|iCurrRight))
                
return true;
            
return false;
        }
    }
}

輸出結果:
byteToString 941.3536
b5b1c7b0cab1bce4
byteTostring_for_insert HEX_TABLE 590.8496
b5b1c7b0cab1bce4
byteTostring_while_Append HEX_TABLE 180.2592
b5b1c7b0cab1bce4
byteTostring_for_Append HEX_TABLE 190.2736
b5b1c7b0cab1bce4
BitConverter 80.1152
B5-B1-C7-B0-CA-B1-BC-E4
whileRun  4977.1568
forRun 5147.4016

結論
1、while for 循環語句的測試;
       執行了40000000000次空循環有些差距,但有時竟然速度相同。所以while for基本任意用。
2、StringBuilder 追加字符方法的測試;
       Insert 和 Append ,append方法速度快。
3、byte的相關方法;
      BitConverter類byte[] 轉換的集合,MS提供的方法速度很快,但出來的字符串 把byte[] 以‘-’分隔,如果進行replace("-","")操作,沒有自定義方法快,並且byte[]越大效率越低。

自定義的方法比較,明天再寫^_*

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章