Падение производительности кода в x64 версии
От: Аноним  
Дата: 31.08.10 08:08
Оценка:
Доброго времени суток.

Есть следующий код:

public class Base64Encoder
{
static Base64Encoder()
{
SixBit2Symbol = Encoding.GetEncoding("ASCII").GetBytes("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=");
}

public static readonly byte[] SixBit2Symbol = null;

public Base64Encoder(Stream stream)
{
_stream = stream;
}

public Base64Encoder(byte[] buffer, int offset, int count)
{
_stream = new MemoryStream(buffer, offset, count);
}

public void Write(Stream stream)
{
int data_size = _buff_size * 3;
int encoded_data_size = _buff_size * 4;
int total_bytes_read = 0;

byte[] data = new byte[data_size];
byte[] encoded_data = new byte[encoded_data_size];

int total_bytes = (int)_stream.Length;

while (total_bytes_read < total_bytes)
{
int data_offset = 0;
int encoded_data_offset = 0;

int bytes_read = _stream.Read(data, 0, data_size);
total_bytes_read += bytes_read;

while (encoded_data_offset < encoded_data_size)
{
if (bytes_read — data_offset >= 3)
{
encoded_data[encoded_data_offset] = SixBit2Symbol[data[data_offset] >> 2];
encoded_data[encoded_data_offset + 1] = SixBit2Symbol[((data[data_offset] & 0x03) << 4) | (data[data_offset + 1] >> 4)];
encoded_data[encoded_data_offset + 2] = SixBit2Symbol[((data[data_offset + 1] & 0x0f) << 2) | (data[data_offset + 2] >> 6)];
encoded_data[encoded_data_offset + 3] = SixBit2Symbol[data[data_offset + 2] & 0x3f];

encoded_data_offset += 4;
data_offset += 3;
}
else
{
int paddingCount = bytes_read — data_offset;

if (paddingCount > 0)
{
if (paddingCount == 1)
{
encoded_data[encoded_data_offset] = SixBit2Symbol[data[data_offset] >> 2];
encoded_data[encoded_data_offset + 1] = SixBit2Symbol[((data[data_offset] & 0x03) << 4) | (data[data_offset + 1] >> 4)];
encoded_data[encoded_data_offset + 2] = SixBit2Symbol[(data[data_offset + 1] & 0x0f) << 2];
encoded_data[encoded_data_offset + 3] = SixBit2Symbol[0x40];

data_offset += 2;
}
else if (paddingCount == 2)
{
encoded_data[encoded_data_offset] = SixBit2Symbol[data[data_offset] >> 2];
encoded_data[encoded_data_offset + 1] = SixBit2Symbol[(data[data_offset] & 0x03) << 4];
encoded_data[encoded_data_offset + 2] = SixBit2Symbol[0x40];
encoded_data[encoded_data_offset + 3] = SixBit2Symbol[0x40];

data_offset += 1;
}

encoded_data_offset += 4;
}

break;
}
}

stream.Write(encoded_data, 0, encoded_data_offset);
}
}

private Stream _stream = null;
private int _buff_size = 1024*6;//16KB
}

Данный код скомпилированный под x64 работает в три раза медленней чем скомпилированный под x86.

Собственно вопрос только один: почему???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.