Skip to content

Commit

Permalink
Presize MemoryStream when possible.
Browse files Browse the repository at this point in the history
Also use GetBuffer when we know we have presized the stream to the exact required size to prevent a needless copy.
  • Loading branch information
RoosterDragon committed Dec 14, 2017
1 parent 502c3e2 commit fbf7fce
Show file tree
Hide file tree
Showing 7 changed files with 19 additions and 13 deletions.
10 changes: 8 additions & 2 deletions OpenRA.Game/FileSystem/ZipFile.cs
Expand Up @@ -44,7 +44,7 @@ public Stream GetStream(string filename)

using (var z = pkg.GetInputStream(entry))
{
var ms = new MemoryStream();
var ms = new MemoryStream((int)entry.Size);
z.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin);
return ms;
Expand Down Expand Up @@ -104,7 +104,13 @@ public ReadWriteZipFile(string filename, bool create = false)
// SharpZipLib breaks when asked to update archives loaded from outside streams or files
// We can work around this by creating a clean in-memory-only file, cutting all outside references
if (!create)
new MemoryStream(File.ReadAllBytes(filename)).CopyTo(pkgStream);
{
using (var copy = new MemoryStream(File.ReadAllBytes(filename)))
{
pkgStream.Capacity = (int)copy.Length;
copy.CopyTo(pkgStream);
}
}

pkgStream.Position = 0;
pkg = ZipFileHelper.Create(pkgStream);
Expand Down
8 changes: 4 additions & 4 deletions OpenRA.Game/Network/Connection.cs
Expand Up @@ -77,10 +77,10 @@ public virtual void SendImmediate(List<byte[]> orders)

public virtual void SendSync(int frame, byte[] syncData)
{
var ms = new MemoryStream();
var ms = new MemoryStream(4 + syncData.Length);
ms.Write(BitConverter.GetBytes(frame));
ms.Write(syncData);
Send(ms.ToArray());
Send(ms.GetBuffer());
}

protected virtual void Send(byte[] packet)
Expand Down Expand Up @@ -197,10 +197,10 @@ void NetworkConnectionReceive(object networkStreamObject)

public override void SendSync(int frame, byte[] syncData)
{
var ms = new MemoryStream();
var ms = new MemoryStream(4 + syncData.Length);
ms.Write(BitConverter.GetBytes(frame));
ms.Write(syncData);
queuedSyncPackets.Add(ms.ToArray());
queuedSyncPackets.Add(ms.GetBuffer());
}

protected override void Send(byte[] packet)
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Game/Network/Order.cs
Expand Up @@ -240,7 +240,7 @@ public byte[] Serialize()
{
if (IsImmediate)
{
var ret = new MemoryStream();
var ret = new MemoryStream(1 + OrderString.Length + TargetString.Length);
var w = new BinaryWriter(ret);
w.Write((byte)0xfe);
w.Write(OrderString);
Expand Down
4 changes: 2 additions & 2 deletions OpenRA.Game/Network/OrderIO.cs
Expand Up @@ -38,14 +38,14 @@ public static List<Order> ToOrderList(this byte[] bytes, World world)

public static byte[] SerializeSync(int sync)
{
var ms = new MemoryStream();
var ms = new MemoryStream(1 + 4);
using (var writer = new BinaryWriter(ms))
{
writer.Write((byte)0x65);
writer.Write(sync);
}

return ms.ToArray();
return ms.GetBuffer();
}

public static int2 ReadInt2(this BinaryReader r)
Expand Down
4 changes: 2 additions & 2 deletions OpenRA.Game/Network/ReplayConnection.cs
Expand Up @@ -127,10 +127,10 @@ public ReplayConnection(string replayFilename)

public void SendSync(int frame, byte[] syncData)
{
var ms = new MemoryStream();
var ms = new MemoryStream(4 + syncData.Length);
ms.Write(BitConverter.GetBytes(frame));
ms.Write(syncData);
sync.Add(ms.ToArray());
sync.Add(ms.GetBuffer());

// Store the current frame so Receive() can return the next chunk of orders.
ordersFrame = frame + LobbyInfo.GlobalSettings.OrderLatency;
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Game/Server/ServerOrder.cs
Expand Up @@ -49,7 +49,7 @@ public static ServerOrder Deserialize(BinaryReader r)

public byte[] Serialize()
{
var ms = new MemoryStream();
var ms = new MemoryStream(1 + Name.Length + Data.Length);
var bw = new BinaryWriter(ms);

bw.Write((byte)0xfe);
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Cnc/FileSystem/MixFile.cs
Expand Up @@ -150,7 +150,7 @@ static MemoryStream Decrypt(uint[] h, Blowfish fish)
{
var decrypted = fish.Decrypt(h);

var ms = new MemoryStream();
var ms = new MemoryStream(decrypted.Length * 4);
var writer = new BinaryWriter(ms);
foreach (var t in decrypted)
writer.Write(t);
Expand Down

0 comments on commit fbf7fce

Please sign in to comment.