diff options
author | Wouter van Oortmerssen <aardappel@gmail.com> | 2016-08-24 09:26:06 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-24 09:26:06 -0700 |
commit | 79d127c86336936f69369d7730d5da78338f5b2b (patch) | |
tree | bd857613f6f6e3a2bb30ef7e4e2488ffb5f15979 | |
parent | 96ab6ade5a1f0af33c37be78f448e68d30b55b34 (diff) | |
parent | 4802e8a285e20a1403c6570690ea02813c967f0b (diff) | |
download | flatbuffers-79d127c86336936f69369d7730d5da78338f5b2b.tar.gz flatbuffers-79d127c86336936f69369d7730d5da78338f5b2b.tar.bz2 flatbuffers-79d127c86336936f69369d7730d5da78338f5b2b.zip |
Merge pull request #2133 from evolutional/cs-bounds-check
C#: added #define BYTEBUFFER_NO_BOUNDS_CHECK
-rwxr-xr-x | net/FlatBuffers/ByteBuffer.cs | 22 | ||||
-rw-r--r-- | tests/FlatBuffers.Test/ByteBufferTests.cs | 18 |
2 files changed, 35 insertions, 5 deletions
diff --git a/net/FlatBuffers/ByteBuffer.cs b/net/FlatBuffers/ByteBuffer.cs index 5fa1ac7a..37a2c7e6 100755 --- a/net/FlatBuffers/ByteBuffer.cs +++ b/net/FlatBuffers/ByteBuffer.cs @@ -14,7 +14,20 @@ * limitations under the License. */ -//#define UNSAFE_BYTEBUFFER // uncomment this line to use faster ByteBuffer +// There are 2 #defines that have an impact on performance of this ByteBuffer implementation +// +// UNSAFE_BYTEBUFFER +// This will use unsafe code to manipulate the underlying byte array. This +// can yield a reasonable performance increase. +// +// BYTEBUFFER_NO_BOUNDS_CHECK +// This will disable the bounds check asserts to the byte array. This can +// yield a small performance gain in normal code.. +// +// Using UNSAFE_BYTEBUFFER and BYTEBUFFER_NO_BOUNDS_CHECK together can yield a +// performance gain of ~15% for some operations, however doing so is potentially +// dangerous. Do so at your own risk! +// using System; @@ -22,9 +35,6 @@ namespace FlatBuffers { /// <summary> /// Class to mimic Java's ByteBuffer which is used heavily in Flatbuffers. - /// If your execution environment allows unsafe code, you should enable - /// unsafe code in your project and #define UNSAFE_BYTEBUFFER to use a - /// MUCH faster version of ByteBuffer. /// </summary> public class ByteBuffer { @@ -126,11 +136,14 @@ namespace FlatBuffers } #endif // !UNSAFE_BYTEBUFFER + private void AssertOffsetAndLength(int offset, int length) { + #if !BYTEBUFFER_NO_BOUNDS_CHECK if (offset < 0 || offset > _buffer.Length - length) throw new ArgumentOutOfRangeException(); + #endif } public void PutSbyte(int offset, sbyte value) @@ -200,7 +213,6 @@ namespace FlatBuffers public unsafe void PutUlong(int offset, ulong value) { AssertOffsetAndLength(offset, sizeof(ulong)); - fixed (byte* ptr = _buffer) { *(ulong*)(ptr + offset) = BitConverter.IsLittleEndian diff --git a/tests/FlatBuffers.Test/ByteBufferTests.cs b/tests/FlatBuffers.Test/ByteBufferTests.cs index b86c3658..3324f12a 100644 --- a/tests/FlatBuffers.Test/ByteBufferTests.cs +++ b/tests/FlatBuffers.Test/ByteBufferTests.cs @@ -40,6 +40,7 @@ namespace FlatBuffers.Test Assert.AreEqual((byte)99, buffer[0]); } +#if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_PutByteCannotPutAtOffsetPastLength() { @@ -47,6 +48,7 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutByte(1, 99)); } +#endif [FlatBuffersTestMethod] public void ByteBuffer_PutShortPopulatesBufferCorrectly() @@ -60,6 +62,7 @@ namespace FlatBuffers.Test Assert.AreEqual((byte)0, buffer[1]); } +#if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_PutShortCannotPutAtOffsetPastLength() { @@ -67,7 +70,9 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutShort(2, 99)); } +#endif +#if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_PutShortChecksLength() { @@ -83,6 +88,7 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutShort(1, 99)); } +#endif [FlatBuffersTestMethod] public void ByteBuffer_PutIntPopulatesBufferCorrectly() @@ -98,6 +104,7 @@ namespace FlatBuffers.Test Assert.AreEqual(0x0A, buffer[3]); } + #if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_PutIntCannotPutAtOffsetPastLength() { @@ -121,6 +128,7 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutInt(2, 0x0A0B0C0D)); } +#endif [FlatBuffersTestMethod] public void ByteBuffer_PutLongPopulatesBufferCorrectly() @@ -140,6 +148,7 @@ namespace FlatBuffers.Test Assert.AreEqual(0x01, buffer[7]); } +#if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_PutLongCannotPutAtOffsetPastLength() { @@ -163,6 +172,7 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutLong(2, 0x010203040A0B0C0D)); } +#endif [FlatBuffersTestMethod] public void ByteBuffer_GetByteReturnsCorrectData() @@ -173,6 +183,7 @@ namespace FlatBuffers.Test Assert.AreEqual((byte)99, uut.Get(0)); } +#if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_GetByteChecksOffset() { @@ -180,6 +191,7 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(()=>uut.Get(1)); } +#endif [FlatBuffersTestMethod] public void ByteBuffer_GetShortReturnsCorrectData() @@ -191,6 +203,7 @@ namespace FlatBuffers.Test Assert.AreEqual(1, uut.GetShort(0)); } +#if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_GetShortChecksOffset() { @@ -206,6 +219,7 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetShort(1)); } +#endif [FlatBuffersTestMethod] public void ByteBuffer_GetIntReturnsCorrectData() @@ -219,6 +233,7 @@ namespace FlatBuffers.Test Assert.AreEqual(0x0A0B0C0D, uut.GetInt(0)); } +#if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_GetIntChecksOffset() { @@ -234,6 +249,7 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetInt(0)); } +#endif [FlatBuffersTestMethod] public void ByteBuffer_GetLongReturnsCorrectData() @@ -251,6 +267,7 @@ namespace FlatBuffers.Test Assert.AreEqual(0x010203040A0B0C0D, uut.GetLong(0)); } +#if !BYTEBUFFER_NO_BOUNDS_CHECK [FlatBuffersTestMethod] public void ByteBuffer_GetLongChecksOffset() { @@ -266,6 +283,7 @@ namespace FlatBuffers.Test var uut = new ByteBuffer(buffer); Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetLong(0)); } +#endif [FlatBuffersTestMethod] public void ByteBuffer_ReverseBytesUshort() |