Presize MemoryStream when possible.

Also use GetBuffer when we know we have presized the stream to the exact required size to prevent a needless copy.
This commit is contained in:
RoosterDragon
2017-12-07 21:28:43 +00:00
committed by abcdefg30
parent 5d8c9a560a
commit ca01a1f186
7 changed files with 19 additions and 13 deletions

View File

@@ -44,7 +44,7 @@ namespace OpenRA.FileSystem
using (var z = pkg.GetInputStream(entry)) using (var z = pkg.GetInputStream(entry))
{ {
var ms = new MemoryStream(); var ms = new MemoryStream((int)entry.Size);
z.CopyTo(ms); z.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin); ms.Seek(0, SeekOrigin.Begin);
return ms; return ms;
@@ -104,7 +104,13 @@ namespace OpenRA.FileSystem
// SharpZipLib breaks when asked to update archives loaded from outside streams or files // 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 // We can work around this by creating a clean in-memory-only file, cutting all outside references
if (!create) 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; pkgStream.Position = 0;
pkg = ZipFileHelper.Create(pkgStream); pkg = ZipFileHelper.Create(pkgStream);

View File

@@ -77,10 +77,10 @@ namespace OpenRA.Network
public virtual void SendSync(int frame, byte[] syncData) 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(BitConverter.GetBytes(frame));
ms.Write(syncData); ms.Write(syncData);
Send(ms.ToArray()); Send(ms.GetBuffer());
} }
protected virtual void Send(byte[] packet) protected virtual void Send(byte[] packet)
@@ -197,10 +197,10 @@ namespace OpenRA.Network
public override void SendSync(int frame, byte[] syncData) 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(BitConverter.GetBytes(frame));
ms.Write(syncData); ms.Write(syncData);
queuedSyncPackets.Add(ms.ToArray()); queuedSyncPackets.Add(ms.GetBuffer());
} }
protected override void Send(byte[] packet) protected override void Send(byte[] packet)

View File

@@ -240,7 +240,7 @@ namespace OpenRA
{ {
if (IsImmediate) if (IsImmediate)
{ {
var ret = new MemoryStream(); var ret = new MemoryStream(1 + OrderString.Length + 1 + TargetString.Length + 1);
var w = new BinaryWriter(ret); var w = new BinaryWriter(ret);
w.Write((byte)0xfe); w.Write((byte)0xfe);
w.Write(OrderString); w.Write(OrderString);

View File

@@ -38,14 +38,14 @@ namespace OpenRA.Network
public static byte[] SerializeSync(int sync) public static byte[] SerializeSync(int sync)
{ {
var ms = new MemoryStream(); var ms = new MemoryStream(1 + 4);
using (var writer = new BinaryWriter(ms)) using (var writer = new BinaryWriter(ms))
{ {
writer.Write((byte)0x65); writer.Write((byte)0x65);
writer.Write(sync); writer.Write(sync);
} }
return ms.ToArray(); return ms.GetBuffer();
} }
public static int2 ReadInt2(this BinaryReader r) public static int2 ReadInt2(this BinaryReader r)

View File

@@ -127,10 +127,10 @@ namespace OpenRA.Network
public void SendSync(int frame, byte[] syncData) 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(BitConverter.GetBytes(frame));
ms.Write(syncData); ms.Write(syncData);
sync.Add(ms.ToArray()); sync.Add(ms.GetBuffer());
// Store the current frame so Receive() can return the next chunk of orders. // Store the current frame so Receive() can return the next chunk of orders.
ordersFrame = frame + LobbyInfo.GlobalSettings.OrderLatency; ordersFrame = frame + LobbyInfo.GlobalSettings.OrderLatency;

View File

@@ -49,7 +49,7 @@ namespace OpenRA.Server
public byte[] Serialize() public byte[] Serialize()
{ {
var ms = new MemoryStream(); var ms = new MemoryStream(1 + Name.Length + 1 + Data.Length + 1);
var bw = new BinaryWriter(ms); var bw = new BinaryWriter(ms);
bw.Write((byte)0xfe); bw.Write((byte)0xfe);

View File

@@ -150,7 +150,7 @@ namespace OpenRA.Mods.Cnc.FileSystem
{ {
var decrypted = fish.Decrypt(h); var decrypted = fish.Decrypt(h);
var ms = new MemoryStream(); var ms = new MemoryStream(decrypted.Length * 4);
var writer = new BinaryWriter(ms); var writer = new BinaryWriter(ms);
foreach (var t in decrypted) foreach (var t in decrypted)
writer.Write(t); writer.Write(t);