Как улучшить производительность преобразования байта [] в int? - PullRequest
2 голосов
/ 28 января 2011

Я пишу двоичный конвертер файлов, в котором мне нужно конвертировать массивы 1-6 байтов в значения типа int (short-long). На данный момент я использую следующие три функции, я хочу знать, есть ли способ улучшить производительность?

private string byteToShortParse(byte[] recordData, int offset, int length)
{
    byte[] workingSet = new byte[2];
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length);
    return (BitConverter.ToInt16(workingSet, 0).ToString());
}

private string byteToIntParse(byte[] recordData, int offset, int length)
{
    byte[] workingSet = new byte[4];
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length);
    return (BitConverter.ToInt32(workingSet, 0).ToString());
}

private string byteToLongParse(byte[] recordData, int offset, int length)
{
    byte[] workingSet = new byte[8];
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length);
    return (BitConverter.ToInt32(workingSet, 0).ToString());
}

Ответы [ 2 ]

1 голос
/ 28 января 2011

Да, оптимальный вариант будет

private string byteToShortParse(byte[] recordData, int offset, int length)
    {
        if (length == 2)
        { 
             short i = (recordData[offset + 1] << 8) | recordData[offset];
             return i.ToString;
        } else return "";

    }

То же самое относится к 4-байтовым и 8-байтовым значениям (требуется только больше сдвигов).

1 голос
/ 28 января 2011

Edit2:

Полагаю, если число байтов, которое нужно преобразовать в int, имеет переменную длину (что кажется странным), я предлагаю сделать это следующим образом:

private string bytesToIntParse(byte[] recordData, int offset, int length)
{
    long result = 0;
    for (int i = 0; i < length; ++i)
    {
        result |= ((long)recordData[i + offset]) << (i * 8);
    }
    return result.ToString();
}

Теперь у вас есть одна функция, нет Buffer.BlockCopy, и она поддерживает любую длину.

Edit1:

Вы можете использовать небезопасный код, такой как:

// I don't think you need to specify a length parameter, since int32 is always 4 bytes
private string byteToIntParse(byte[] recordData, int offset, int length)
{
    unsafe
    {
        fixed (byte* p = &recordData[offset])
        {
            // This result will differ on little and big endian architectures.
            return (*(int*)p).ToString();
        }
    }
}

Но это то, что BitConverter делает внутри, поэтому я не думаю, что вы получите какую-либо производительность

Почему вы копируете байты в workingSet? Вы могли бы просто:

return BitConverter.ToInt32(recordData, offset).ToString()

Полагаю, это повышает производительность, поскольку вам не нужно каждый раз вызывать Buffer.BlockCopy: P

...