2008-10-22 22 views
6

我有一組短褲(短[]),我需要寫出一個文件。什麼是最快的方法來做到這一點?用C#編寫一個簡短的[]數組到一個文件的最好方法是什麼?

+0

我剛剛意識到「短褲陣列」聽起來很有趣。對不起,這是一個真正的問題。 – MusiGenesis 2008-10-22 02:17:35

+0

這將有助於如果你提到你想要的格式,它們在二進制,人類可讀的,逗號分隔,每行一個...... – tvanfosson 2008-10-22 02:23:08

回答

11

使用的BinaryWriter

static void WriteShorts(short[] values, string path) 
    { 
     using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) 
     { 
      using (BinaryWriter bw = new BinaryWriter(fs)) 
      { 
       foreach (short value in values) 
       { 
        bw.Write(value); 
       } 
      } 
     } 
    } 
2

喬恩B的回答跟進,如果你的文件包含的任何其他數據,你可能要與值的計數的前綴數據。

即:對於

static void WriteShorts(short[] values, string path) 
{ 
    using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) 
    { 
     using (BinaryWriter bw = new BinaryWriter(fs)) 
     { 
      // Write the number of items 
      bw.Write(values.Length); 

      foreach (short value in values) 
      { 
       bw.Write(value); 
      } 
     } 
    } 
} 
1

的BinaryFormatter實際上大約快10倍既用於讀出,並與基本類型數組使用時寫入的,即不()obj.GetType(IsPrimitive。)十進制和字符串(這不是原始的),當然不適用於任何其他結構或類,而是非常緩慢。

[Test] 
public void TestShortArray() 
{ 
    var n = 100000000; 
    var input = new short[n]; 
    var r = new Random(); 
    for (var i = 0; i < n; i++) input[i] = (short)r.Next(); 
    var bf = new BinaryFormatter(); 
    var sw = new Stopwatch(); 
    using (var ms = new MemoryStream()) 
    { 
    sw.Start(); 
    bf.Serialize(ms, input); 
    sw.Stop(); 
    Console.WriteLine("BinaryFormatter serialize: " + 
     sw.ElapsedMilliseconds + " ms, " + ms.ToArray().Length + " bytes"); 
    sw.Reset(); 
    ms.Seek(0, SeekOrigin.Begin); 
    sw.Start(); 
    var output = (short[])bf.Deserialize(ms); 
    sw.Stop(); 
    Console.WriteLine("BinaryFormatter deserialize: " + 
     sw.ElapsedMilliseconds + " ms, " + ms.ToArray().Length + " bytes"); 
    Assert.AreEqual(input, output); 
    } 
    sw.Reset(); 
    using (var ms = new MemoryStream()) 
    { 
    var bw = new BinaryWriter(ms, Encoding.UTF8, true); 
    sw.Start(); 
    bw.Write(input.Length); 
    for (var i = 0; i < input.Length; i++) bw.Write(input[i]); 
    sw.Stop(); 
    Console.WriteLine("BinaryWriter serialize: " + 
     sw.ElapsedMilliseconds + " ms, " + ms.ToArray().Length + " bytes"); 
    sw.Reset(); 
    ms.Seek(0, SeekOrigin.Begin); 
    var br = new BinaryReader(ms, Encoding.UTF8, true); 
    sw.Start(); 
    var length = br.ReadInt32(); 
    var output = new short[length]; 
    for (var i = 0; i < length; i++) output[i] = br.ReadInt16(); 
    sw.Stop(); 
    Console.WriteLine("BinaryReader deserialize: " + 
     sw.ElapsedMilliseconds + " ms, " + ms.ToArray().Length + " bytes"); 
    Assert.AreEqual(input, output); 
    } 
} 

輸出:

BinaryFormatter serialize: 175 ms, 200000028 bytes 
BinaryFormatter deserialize: 79 ms, 200000028 bytes 
BinaryWriter serialize: 1499 ms, 200000004 bytes 
BinaryReader deserialize: 1599 ms, 200000004 bytes 

因此,使用BinaryFormatter的,只要你有一個基本類型的數組,或數組而不是多暗淡數組的數組(!)。如果你的數據類型是例如Point3(double),你應該填充一個double []並且序列化它。僅對BinaryWriter使用複雜/混合類型,字符串,小數和奇異值。

當處理byte []時,BinaryFormatter和BinaryWriter同樣是高性能的(並且速度非常快)。如果你能夠以有效的方式將你的類型轉換爲字節數組,你可以通過這種方式獲得更快的性能。

相關問題