簡體   English   中英

將字節寫入結構中的字節數組的最佳方法?

[英]Best way to write bytes to a byte array in a struct?

我正在嘗試創建一個數據包結構,它基本上是一個固定長度的字節生成器。 我有一個用 3 種不同方式編寫的 WriteByte function。 只是想知道哪個是最好的(或者是否有更好的方法)以及哪個會讓 GC 滿意。 順便說一句,我有一個 Position 字段,在寫入一個字節時必須對其進行更新。 這些功能將擴展到包括 WriteUInt16、WriteFloat 等...不確定最佳方法是什么。 任何建議表示贊賞。

  1. 這應該是一個結構嗎? 我想做盡可能少的分配,因為這些包會非常頻繁地創建。
  2. 我應該將 WriteByte 作為方法(選項 1),作為 Pack 的擴展(由 ref 傳遞)(選項 2),還是只使用 static 助手 class(由 ref 傳遞)(選項 3)?

這是代碼:

public struct Pack
{
    public byte[] Data { get; internal set; }
    public int Pos { get; internal set; }
    
    public Pack(byte opcode, ushort size)
    {
        ++size;                     // make room for byte opcode
        Data = new byte[2 + size];  // make room to prepend the size (ushort)
        BitConverter.GetBytes(size).CopyTo(Data, 0);
        Data[2] = opcode;
        Pos = 3;                    // start writing at position 3
    }

    // option 1
    // use: pack.WriteByte(0x01)
    public void WriteByte(byte value) => Data[Pos++] = value;
}

public static class SPackExtensions
{
    // option 2
    // use: pack.WriteByte(0x01)
    public static void WriteByte(ref this Pack pack, byte value)
    {
        pack.Data[pack.Pos++] = value;
    }
}

public static class PackWriter
{
    // option 3
    // use: PackWriter.WriteByte(ref pack, 0x01)
    public static void WriteByte(ref Pack pack, byte value)
    {
        pack.Data[pack.Pos++] = value;
    }
}

這應該是一個結構嗎? 我想做盡可能少的分配,因為這些包會非常頻繁地創建。

或許。 即使使用結構,您仍將分配兩個對象,一個用於將大小轉換為數組,另一個用於數組本身。 因此分配 object 的開銷可能可以忽略不計,特別是因為它可能比數組小得多。 但是, 建議結構是不可變的,因為如果共享數據數組但 Pos 不是,則在傳遞 object 時可能會非常混亂。

但是您可能應該使用BitConverter.TryWriteBytesBinaryPrimitives.TryWriteInt16LittleEndian來避免在寫入長度時進行分配。

我應該將 WriteByte 作為方法(選項 1),作為 Pack 的擴展(由 ref 傳遞)(選項 2),還是只使用 static 助手 class(由 ref 傳遞)(選項 3)?

生成的代碼應該是相同的,所以 go 是最容易使用和最易讀的代碼。 我可能會贊成選項 1。在我看來,在這種情況下使用擴展方法或輔助類幾乎沒有什么優勢。

這些包將非常頻繁地創建

在編寫性能優化代碼時,一個好的原則是完全避免分配。 據我所知,這個 object 不可能放入 object 池中並重復使用,因為 position 參數無法重置。 因此,我會考慮將我的 object 基於從固定大小緩沖區池中獲取的跨度。

另外,我強烈建議您分析您的代碼。 “非常頻繁”的范圍可能從 1hz 到 10^9hz,具體取決於上下文。 因此,您應該檢查在您的特定上下文中這是否是一個實際問題。

暫無
暫無

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

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