Skip to content

Commit 891da69

Browse files
committed
In JavaScriptEngineSwitcher.ChakraCore optimized a memory usage by using the ArrayPool<T>
1 parent 9bd973b commit 891da69

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

src/JavaScriptEngineSwitcher.ChakraCore/JavaScriptEngineSwitcher.ChakraCore.csproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ This package does not contain the native implementations of ChakraCore. Therefor
3838
<ProjectReference Include="../JavaScriptEngineSwitcher.Core/JavaScriptEngineSwitcher.Core.csproj" />
3939
</ItemGroup>
4040

41+
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' Or '$(TargetFramework)' == 'net471' Or '$(TargetFramework)' == 'netstandard1.3' ">
42+
<PackageReference Include="System.Buffers" Version="4.0.0" />
43+
</ItemGroup>
44+
45+
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
46+
<PackageReference Include="System.Buffers" Version="4.4.0" />
47+
</ItemGroup>
48+
4149
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
4250
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.1.0" />
4351
<PackageReference Include="System.Threading.Thread" Version="4.0.0" />

src/JavaScriptEngineSwitcher.ChakraCore/JsRt/JsPropertyId.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
#if NET45 || NET471 || NETSTANDARD
3+
using System.Buffers;
34
using System.Runtime.InteropServices;
45
#endif
56
using System.Text;
@@ -53,13 +54,31 @@ public string Name
5354
JsErrorCode errorCode = NativeMethods.JsCopyPropertyId(this, buffer, bufferSize, out length);
5455
JsErrorHelpers.ThrowIfError(errorCode);
5556

56-
buffer = new byte[(int)length];
57+
string name;
5758
bufferSize = length;
59+
#if NET45 || NET471 || NETSTANDARD
60+
var byteArrayPool = ArrayPool<byte>.Shared;
61+
buffer = byteArrayPool.Rent((int)bufferSize);
62+
63+
try
64+
{
65+
errorCode = NativeMethods.JsCopyPropertyId(this, buffer, bufferSize, out length);
66+
JsErrorHelpers.ThrowIfError(errorCode);
67+
68+
name = Encoding.UTF8.GetString(buffer, 0, (int)bufferSize);
69+
}
70+
finally
71+
{
72+
byteArrayPool.Return(buffer, true);
73+
}
74+
#else
75+
buffer = new byte[(int)bufferSize];
5876

5977
errorCode = NativeMethods.JsCopyPropertyId(this, buffer, bufferSize, out length);
6078
JsErrorHelpers.ThrowIfError(errorCode);
6179

62-
string name = Encoding.UTF8.GetString(buffer);
80+
name = Encoding.UTF8.GetString(buffer);
81+
#endif
6382

6483
return name;
6584
}

src/JavaScriptEngineSwitcher.ChakraCore/JsRt/JsValue.cs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
using System;
2+
#if NET45 || NET471 || NETSTANDARD
3+
using System.Buffers;
4+
#endif
25
using System.Runtime.InteropServices;
36
using System.Text;
47
#if NET40
@@ -262,7 +265,7 @@ public byte[] ArrayBufferBytes
262265
return new byte[0];
263266
}
264267

265-
byte[] buffer = new byte[bufferLength];
268+
var buffer = new byte[bufferLength];
266269
Marshal.Copy(bufferPtr, buffer, 0, (int)bufferLength);
267270

268271
return buffer;
@@ -729,12 +732,29 @@ public int ToInt32()
729732
JsErrorHelpers.ThrowIfError(errorCode);
730733

731734
length = (int)written;
735+
#if NET45 || NET471 || NETSTANDARD
736+
var charArrayPool = ArrayPool<char>.Shared;
737+
buffer = charArrayPool.Rent(length);
738+
739+
try
740+
{
741+
errorCode = NativeMethods.JsCopyStringUtf16(this, start, length, buffer, out written);
742+
JsErrorHelpers.ThrowIfError(errorCode);
743+
744+
result = new string(buffer, start, length);
745+
}
746+
finally
747+
{
748+
charArrayPool.Return(buffer, true);
749+
}
750+
#else
732751
buffer = new char[length];
733752

734753
errorCode = NativeMethods.JsCopyStringUtf16(this, start, length, buffer, out written);
735754
JsErrorHelpers.ThrowIfError(errorCode);
736755

737756
result = new string(buffer);
757+
#endif
738758
}
739759
else
740760
{
@@ -745,13 +765,30 @@ public int ToInt32()
745765
errorCode = NativeMethods.JsCopyString(this, buffer, bufferSize, out length);
746766
JsErrorHelpers.ThrowIfError(errorCode);
747767

748-
buffer = new byte[(int)length];
749768
bufferSize = length;
769+
#if NET45 || NET471 || NETSTANDARD
770+
var byteArrayPool = ArrayPool<byte>.Shared;
771+
buffer = byteArrayPool.Rent((int)bufferSize);
772+
773+
try
774+
{
775+
errorCode = NativeMethods.JsCopyString(this, buffer, bufferSize, out length);
776+
JsErrorHelpers.ThrowIfError(errorCode);
777+
778+
result = Encoding.UTF8.GetString(buffer, 0, (int)bufferSize);
779+
}
780+
finally
781+
{
782+
byteArrayPool.Return(buffer, true);
783+
}
784+
#else
785+
buffer = new byte[(int)bufferSize];
750786

751787
errorCode = NativeMethods.JsCopyString(this, buffer, bufferSize, out length);
752788
JsErrorHelpers.ThrowIfError(errorCode);
753789

754790
result = Encoding.UTF8.GetString(buffer);
791+
#endif
755792
}
756793

757794
return result;

0 commit comments

Comments
 (0)